反思,调用

时间:2010-05-23 00:00:00

标签: c# reflection

我有一个dll文件,我从中获取了一个对象并通过该对象调用此dll中的函数,如下所示:

Command testClass = (Command)assembly.CreateInstance(creatObject);                
testClass.Execute();

我出于某种原因使用了反射。所以我需要使用invoke功能&设置变量的值,然后调用基本函数Exec​​ute。

以前我写了以下内容:

object returnValue = objectType.GetMethod("setValues").Invoke(classObject, arguments);
testClass.Execute();

但它对我没用。

我使用了以下内容:

object returnValue = objectType.GetMethod("setValues").Invoke(classObject, arguments);
object returnValue1 = objectType.GetMethod("Execute").Invoke(classObject, null);

我只想问这是否正确,以这种方式调用执行,以及它的工作方式!

3 个答案:

答案 0 :(得分:3)

只要您知道自己在做什么,使用Reflection的方法就可以“使用”。使用Reflection时需要考虑很多事情:

  • 不安全 - 您很容易犯错误 - 如果更改方法名称,编译器将不会通知您,并且您将在运行时发现
  • - 反射效率很低 - 调用方法的速度要慢一个数量级。

如果您只需要很少这样做,那么可能没问题。但是,使用共享基类Command的初始方法对我来说似乎更好。你能澄清为什么你决定使用Reflection,这样我们可以(或许)建议一个更好的方法吗?

如果您需要动态调用,您还可以考虑使用C#4.0 dynamic,它可以为您完成所有这些工作,并且比简单的反射效率更高。但是,你仍然应该有充分的理由这样做。

答案 1 :(得分:1)

这是不对的,为什么使用Reflection,提供一个通用接口并直接调用该方法。如果您不知道为什么使用反射,那就错了:)

如果您正在实施可扩展系统,那么MEF会更好吗?

答案 2 :(得分:0)

感谢您的回答,我知道为什么我使用了Reflection。 因为我需要在运行时设置函数setValues(i, j..etc)的值,并且这些参数及其名称与dll不同。 然后我必须用它的当前值调用这个函数,&最后运行另一个名为Execute()的函数,该函数具有相同的当前值,可以从程序的执行更改为另一个! 所以当我刚刚使用时:

object returnValue = objectType.GetMethod("setValues").Invoke(classObject, arguments);
testClass.Execute();

执行没有使用输入的运行时值。 但是由此:

object returnValue = objectType.GetMethod("setValues").Invoke(classObject, arguments);
object returnValue1 = objectType.GetMethod("Execute").Invoke(classObject, null);

它有效。 所以我只想确定,我的工作是正确的,不仅适合我的情况!