如果我有Object
并且Type
,那么按名称调用某个方法会有什么方法,例如“Method1”?
我想做这样的事情:
Object o;
Type t;
// At this point I know, that 'o' actually has
// 't' as it's type.
// And I know that 't' definitely has a public method 'Method1'.
// So, I want to do something like:
Reflection.CallMethodByName(o, "Method1");
这在某种程度上是可能的吗?我确实意识到这会很慢,这很不方便,但不幸的是我没有其他方法可以实现这一点。
答案 0 :(得分:12)
你会使用:
// Use BindingFlags for non-public methods etc
MethodInfo method = t.GetMethod("Method1");
// null means "no arguments". You can pass an object[] with arguments.
method.Invoke(o, null);
有关详细信息,请参阅MethodBase.Invoke
docs - 例如传递论据。
dynamic
的Stephen的方法可能会更快(并且更容易阅读)。
(如果可能的话,让所涉及的类型更好地实现一个众所周知的界面,当然。)
答案 1 :(得分:11)
如果具体方法名称仅在运行时已知,则无法使用动态,需要使用以下内容:
t.GetMethod("Method1").Invoke(o, null);
这假设Method1
没有参数。如果是,则需要使用GetMethod
的一个重载,并将参数作为第二个参数传递给Invoke
。
答案 2 :(得分:8)
最简单的方法:
dynamic myObject = o;
myObject.Method1();