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