在PHP中,我可以尝试调用对象上可能存在的任何方法:
$object->{$method}();
$object
是我们的PHP对象,$method
是我们想要调用的方法的名称。我可以用这种方式动态调用任何方法。
有没有与之相当的C#?或者我只是“做错了”?我有一个插件/模块通过Reflection加载,我想调用一个未在接口中定义的方法。
谢谢!
答案 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#用户的常见误解。如果模块中的接口是在没有您想要调用的方法的情况下设计的,则可能有充分的理由做出此决定。如果模块设计正确,您无论如何都无法调用此方法 - 它可以是private
或internal
。