C#のリフレクションについて、思いつくままにコードを書く

C#のリフレクションについて、いくつかの簡単なプログラムを書いてみる。


ReflectionTestクラスのフィールド情報を取得する。

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

class ReflectionTest
{
    public Int32 i = 0;
    public String s = String.Empty;
    public Double d = 0.0;
    public override String ToString()
    {
        return String.Format("i = {0}, s = {1}, d = {2}", i, s, d);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Type t = typeof(ReflectionTest);
        foreach (FieldInfo fi in t.GetFields())
        {
            Console.WriteLine("Name:{0}, Type:{1}, Public:{2}, Static:{3}, MetadataToken:{4}",
                fi.Name, fi.FieldType, fi.IsPublic, fi.IsStatic, fi.MetadataToken);
        }
    }
}


  • 実行結果
  • Name:i, Type:System.Int32, Public:True, Static:False, MetadataToken:67108865
    Name:s, Type:System.String, Public:True, Static:False, MetadataToken:67108866
    Name:d, Type:System.Double, Public:True, Static:False, MetadataToken:67108867



    ReflectionTestクラスのインスタンスに値をセットする

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Reflection;
    
    class ReflectionTest
    {
        public Int32 i = 0;
        public String s = String.Empty;
        public Double d = 0.0;
        public override String ToString()
        {
            return String.Format("i = {0}, s = {1}, d = {2}", i, s, d);
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Type t = typeof(ReflectionTest);
            Object o = Activator.CreateInstance(typeof(ReflectionTest));
            foreach (FieldInfo fi in t.GetFields())
            {
                if (fi.Name == "i")
                {
                    //Int32型のフィールド i に 100 をセット
                    fi.SetValue(o, 100);
                }
                else if (fi.Name == "s")
                {
                    //String型のフィールド s に "String" をセット
                    fi.SetValue(o, "String");
                }
                else if (fi.Name == "d")
                {
                    //Double型のフィールド d に 11.11 をセット
                    fi.SetValue(o, 11.11);
                }
            }
            ReflectionTest reflectionTest = (ReflectionTest)o;
            Console.WriteLine(reflectionTest);
        }
    }


  • 実行結果
  • i = 100, s = String, d = 11.11
    



    ReflectionTestクラスのメソッド情報を取得する

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Reflection;
    
    class ReflectionTest
    {
        public Int32 i = 0;
        public String s = String.Empty;
        public Double d = 0.0;
        public void MethodA()
        {
            Console.WriteLine("This is MethodA");
        }
        public override String ToString()
        {
            return String.Format("i = {0}, s = {1}, d = {2}", i, s, d);
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Type t = typeof(ReflectionTest);
            foreach (MethodInfo mi in t.GetMethods())
            {
                Console.WriteLine("Name = {0}, Public = {1}, DeclaringType = {2}", 
                    mi.Name, mi.IsPublic, mi.DeclaringType);
            }
        }
    }

  • 実行結果
  • Name = MethodA, Public = True, DeclaringType = ReflectionTest
    Name = ToString, Public = True, DeclaringType = ReflectionTest
    Name = GetType, Public = True, DeclaringType = System.Object
    Name = Equals, Public = True, DeclaringType = System.Object
    Name = GetHashCode, Public = True, DeclaringType = System.Object


    Stringを1つ引数にもつメソッドを呼び出す

    class ReflectionTest
    {
        public Int32 i = 0;
        public String s = String.Empty;
        public Double d = 0.0;
        public void MethodA(String s)
        {
            Console.WriteLine("This is MethodA:{0}", s);
        }
        public void MethodB(String s)
        {
            Console.WriteLine("This is MethodB:{0}", s);
        }
    
        public override String ToString()
        {
            return String.Format("i = {0}, s = {1}, d = {2}", i, s, d);
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Object o = Activator.CreateInstance(typeof(ReflectionTest));
            Type t = typeof(ReflectionTest);
            foreach (MethodInfo mi in t.GetMethods())
            {
                ParameterInfo[] parameters = mi.GetParameters();
    
                //引数が1つでかつ、型がStringのメソッドを呼び出す
                if (parameters.Length == 1 && parameters[0].ParameterType == typeof(String))
                {
                    mi.Invoke(o, new Object[1] { String.Format("{0} is called", mi.Name) });
                }
            }
        }
    }

  • 実行結果
  • This is MethodA:MethodA is called
    This is MethodB:MethodB is called