我有一个dll文件,我从中获取了一个对象并通过该对象调用此dll中的函数,如下所示:
Command testClass = (Command)assembly.CreateInstance(creatObject);
testClass.Execute();
我出于某种原因使用了反射。所以我需要使用invoke功能&设置变量的值,然后调用基本函数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);
我只想问这是否正确,以这种方式调用执行,以及它的工作方式!
答案 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);
它有效。 所以我只想确定,我的工作是正确的,不仅适合我的情况!