C#等效的PHP动态方法调用

时间:2010-10-10 09:50:02

标签: c# php reflection

在PHP中,我可以尝试调用对象上可能存在的任何方法:

$object->{$method}();

$object是我们的PHP对象,$method是我们想要调用的方法的名称。我可以用这种方式动态调用任何方法。

有没有与之相当的C#?或者我只是“做错了”?我有一个插件/模块通过Reflection加载,我想调用一个未在接口中定义的方法。

谢谢!

3 个答案:

答案 0 :(得分:6)

与PHP相反,C#是一种静态类型语言,这意味着需要在编译时知道类型。虽然这种方法已经在C#4.0中引入。这是dynamic关键字。它允许您声明动态类型的变量并调用您喜欢的任何方法,编译器不会抗议。决议将在运行时完成:

dynamic obj = FetchInstanceFromSomewhere();
obj.Method();

另一种更经典的方法是使用反射,但这很快就会变成一场噩梦。

答案 1 :(得分:3)

As answered here,C#4有动态关键字,可以调用动态方法。

如果您使用的是旧版本,可以使用Reflection执行此操作,但我认为这样做是错误的。这样做的C#方式是确保加载的插件有一个接口,其中包含您需要调用的方法。

无论如何,如果你需要使用反射来做,这是一个例子:

Type type = instance.GetType();
MethodInfo m = type.GetMethod("MethodName");
m.Invoke(instance, new object[] {});

这是针对不带参数的公共方法。

答案 2 :(得分:2)

  

我在via中加载了一个插件/模块   反思,我想打个电话   它上面没有定义的方法   界面

小心但是...引用的句子让我猜你做错了什么。使用反射'救援'是许多c#用户的常见误解。如果模块中的接口是在没有您想要调用的方法的情况下设计的,则可能有充分的理由做出此决定。如果模块设计正确,您无论如何都无法调用此方法 - 它可以是privateinternal