这个问题在这里已有答案:
我正在使用WPF mvvm模式,如果某些方法得到字符串参数,这可能是这样的调用
SomeClass1 sc = new SomeClass();
DummyClass2 dc = new DummyClass2();
public void SomeMethod(string param) //param = "SomeMethodName"
{
sc.'param'(dc);
}
关键是通过param调用类对象函数而不使用分支或数据结构映射。
也许使用反思..任何好主意?
是的,可以通过反思来实现。您可以使用Invoke
方法。
它看起来像这样:
MethodInfo method = type.GetMethod(name);
object result = method.Invoke(objectToCallTheMethodOn);
话虽如此,在正常情况下你不应该使用反射来调用c#中的方法。它只适用于特殊情况。
这是一个完整的例子:
class A
{
public int MyMethod(string name) {
Console.WriteLine( $"Hi {name}!" );
return 7;
}
}
public static void Main()
{
var a = new A();
var ret = CallByName(a, "MyMethod", new object[] { "Taekyung Lee" } );
Console.WriteLine(ret);
}
private static object CallByName(A a, string name, object[] paramsToPass )
{
//Search public methods
MethodInfo method = a.GetType().GetMethod(name);
if( method == null )
{
throw new Exception($"Method {name} not found on type {a.GetType()}, is the method public?");
}
object result = method.Invoke(a, paramsToPass);
return result;
}
这打印:
Hi Taekyung Lee!
7