2005年03月30日
C# Reflectionでメソッドにアクセス
オブジェクトが持つプロパティに対して、Reflectionでアクセスしたい。
下記のクラスのメソッドにアクセスする。
namespace aaa.bbb{
public class SampleClass
{
public void methodA()
{
Console.WriteLine("MethodA Called");
}
public void methodA(String str)
{
Console.WriteLine("MethodA Called: Param="+ str);
}
public void methodC(String str, int index)
{
Console.WriteLine("MethodC Called: Param1="+str+" Param2="+index);
}
public String methodD()
{
Console.WriteLine("MethodD Called");
return "This method is [methodD].";
}
}
}
以下の方法でアクセスすることが可能。
下記のクラスのメソッドにアクセスする。
namespace aaa.bbb{
public class SampleClass
{
public void methodA()
{
Console.WriteLine("MethodA Called");
}
public void methodA(String str)
{
Console.WriteLine("MethodA Called: Param="+ str);
}
public void methodC(String str, int index)
{
Console.WriteLine("MethodC Called: Param1="+str+" Param2="+index);
}
public String methodD()
{
Console.WriteLine("MethodD Called");
return "This method is [methodD].";
}
}
}
以下の方法でアクセスすることが可能。
Object obj = new SampleClass();
//引数なしのmethodAにアクセス
MethodInfo method = obj.GetType().GetMethod("methodA",new Type[0]);
method.Invoke(obj, null);
//引数ありのmethodAにアクセス
method = obj.GetType().GetMethod("methodA",new Type[]{typeof(String)});
method.Invoke(obj, new Object[]{"StringParam"});
//引数が2個あるmethodCにアクセス
method = obj.GetType().GetMethod("methodC", new Type[]{typeof(String), typeof(int)});
method.Invoke(obj, new Object[]{"StringParam", 100});
//戻り値のあるmethodDにアクセス
method = obj.GetType().GetMethod("methodD", new Type[0]);
Console.WriteLine("ReturnObject="+ method.Invoke(obj,null));
GetMethodメソッドを呼ぶ際に何通りか呼び方があり、一番簡単なものとしてメソッド名のみを指定した方法がある。
この場合は呼び出すメソッドがオーバーロード(同じメソッド名で引数が異なる)されていないことが前提となる。
たとえば以下のように記述する。
//引数なしのmethodAにアクセス
MethodInfo method = obj.GetType().GetMethod("methodA");
method.Invoke(obj, null);
すると「AmbiguousMatchException: あいまいな一致が見つかりました。」という例外が発生する。
SampleClassではmethodAが2個存在するのでメソッドを特定できないで例外となっている。
このようなケースがあるので、メソッドを常に引数は指定しておいたほうが安全だと思われる。
戻り値は常にObject型で返されるので、適当な型に変換する必要がある。
//引数なしのmethodAにアクセス
MethodInfo method = obj.GetType().GetMethod("methodA",new Type[0]);
method.Invoke(obj, null);
//引数ありのmethodAにアクセス
method = obj.GetType().GetMethod("methodA",new Type[]{typeof(String)});
method.Invoke(obj, new Object[]{"StringParam"});
//引数が2個あるmethodCにアクセス
method = obj.GetType().GetMethod("methodC", new Type[]{typeof(String), typeof(int)});
method.Invoke(obj, new Object[]{"StringParam", 100});
//戻り値のあるmethodDにアクセス
method = obj.GetType().GetMethod("methodD", new Type[0]);
Console.WriteLine("ReturnObject="+ method.Invoke(obj,null));
GetMethodメソッドを呼ぶ際に何通りか呼び方があり、一番簡単なものとしてメソッド名のみを指定した方法がある。
この場合は呼び出すメソッドがオーバーロード(同じメソッド名で引数が異なる)されていないことが前提となる。
たとえば以下のように記述する。
//引数なしのmethodAにアクセス
MethodInfo method = obj.GetType().GetMethod("methodA");
method.Invoke(obj, null);
すると「AmbiguousMatchException: あいまいな一致が見つかりました。」という例外が発生する。
SampleClassではmethodAが2個存在するのでメソッドを特定できないで例外となっている。
このようなケースがあるので、メソッドを常に引数は指定しておいたほうが安全だと思われる。
戻り値は常にObject型で返されるので、適当な型に変換する必要がある。
トラックバックURL
この記事へのコメント
1. Posted by Desktop Wallpapers 2017年08月12日 09:32
悲しみのない敗者がないよりも大きいが戦っていないことの恥です!