C# 反射,调用

C# 反射,调用,c#,reflection,C#,Reflection,我有一个dll文件,我从中取出一个对象,并通过该对象调用该dll中的函数,如下所示: Command testClass = (Command)assembly.CreateInstance(creatObject); testClass.Execute(); 出于某种原因,我使用了反射。所以我需要使用invoke函数&为变量设置值,然后调用基本函数Execute 在此之前,我写了以下内容: object returnValue = objectType.Get

我有一个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);
但这对我没用

我使用了以下方法:

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);

我只是想问一下,用这种方式调用execute是否正确,顺便说一下它的工作方式

这是不对的,为什么要使用反射、提供公共接口并直接调用该方法。如果您不知道为什么要使用反射,那么它是错误的:)


如果您正在实现一个可扩展的系统,也许MEF会更好?

这是不对的,为什么要使用反射,提供一个公共接口并直接调用该方法。如果您不知道为什么要使用反射,那么它是错误的:)


如果您正在实现一个可扩展系统,也许MEF会更好?

使用反射调用方法只要您知道自己在做什么,使用反射的方式是“好的”。使用反射时有很多事情需要考虑:

  • 这是不安全的——您很容易犯错误——如果您更改了方法名,编译器不会通知您,您会在运行时发现这一点
  • 它是慢的-反射效率很低-调用一个方法的速度要慢几个数量级
如果你很少需要这样做,那也没关系。然而,您最初使用共享基类
命令的方法对我来说似乎是一个更好的主意。你能解释一下为什么你决定使用反射,这样我们就可以(也许)提出一个更好的方法吗


如果你需要动态调用,你也可以考虑使用C 4(代码)>动态< /代码>,它为你做了所有这些事情,比简单的反射更有效。但是,您仍然应该有很好的理由这样做。

只要您知道自己在做什么,就可以使用反射调用方法。使用反射时有很多事情需要考虑:

  • 这是不安全的——您很容易犯错误——如果您更改了方法名,编译器不会通知您,您会在运行时发现这一点
  • 它是慢的-反射效率很低-调用一个方法的速度要慢几个数量级
如果你很少需要这样做,那也没关系。然而,您最初使用共享基类
命令的方法对我来说似乎是一个更好的主意。你能解释一下为什么你决定使用反射,这样我们就可以(也许)提出一个更好的方法吗


如果你需要动态调用,你也可以考虑使用C 4(代码)>动态< /代码>,它为你做了所有这些事情,比简单的反射更有效。不过,你还是应该有很好的理由这样做。

谢谢你的回答,我当然知道我为什么使用反射。 因为我需要在运行时为函数
setValues(i,j..etc)
设置值,这些参数及其名称在不同的dll中是不同的。 然后我必须使用当前值调用此函数,最后使用相同的当前值运行另一个名为
Execute()
的函数,该函数可以为程序从Execute更改为另一个! 所以当我刚刚使用:

object returnValue = objectType.GetMethod("setValues").Invoke(classObject, arguments);
testClass.Execute();
execute与输入的运行时值不兼容。 但通过这一点:

object returnValue = objectType.GetMethod("setValues").Invoke(classObject, arguments);
object returnValue1 = objectType.GetMethod("Execute").Invoke(classObject, null);
它起作用了。
所以我只想确定,我的工作是正确的,不仅适合我的情况

谢谢你的回答,我当然知道我为什么用反思。 因为我需要在运行时为函数
setValues(i,j..etc)
设置值,这些参数及其名称在不同的dll中是不同的。 然后我必须使用当前值调用此函数,最后使用相同的当前值运行另一个名为
Execute()
的函数,该函数可以为程序从Execute更改为另一个! 所以当我刚刚使用:

object returnValue = objectType.GetMethod("setValues").Invoke(classObject, arguments);
testClass.Execute();
execute与输入的运行时值不兼容。 但通过这一点:

object returnValue = objectType.GetMethod("setValues").Invoke(classObject, arguments);
object returnValue1 = objectType.GetMethod("Execute").Invoke(classObject, null);
它起作用了。 所以我只想确定,我的工作是正确的,不仅适合我的情况