你怎么用它的“名字”来称呼方法?

时间:2011-05-11 15:42:09

标签: c# reflection object

如果我有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");

这在某种程度上是可能的吗?我确实意识到这会很慢,这很不方便,但不幸的是我没有其他方法可以实现这一点。

3 个答案:

答案 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 - 例如传递论据。

如果您使用C#4并且在编译时知道方法名称,那么使用dynamic的Stephen的方法可能会更快(并且更容易阅读)。

(如果可能的话,让所涉及的类型更好地实现一个众所周知的界面,当然。)

答案 1 :(得分:11)

如果具体方法名称仅在运行时已知,则无法使用动态,需要使用以下内容:

t.GetMethod("Method1").Invoke(o, null);

这假设Method1没有参数。如果是,则需要使用GetMethod的一个重载,并将参数作为第二个参数传递给Invoke

答案 2 :(得分:8)

最简单的方法:

dynamic myObject = o;
myObject.Method1();