1

我想在运行时使用反射加载一个类型。以下是步骤:

  1. 使用加载程序集Assembly.LoadFile(assemblyPath);
  2. 使用GetType方法获取类型
  3. 用于Activator.CreateInstance创建类型的实例。

下面是我的代码:

Assembly assembly = Assembly.LoadFile(assemblyName);
Type type = assembly.GetType("RomanConerter.Converter");
object obj = Activator.CreateInstance(type);

我面临的问题是最后一行。我的转换器有一个方法名称Add。但我无法使用 obj 访问此方法。

注意:我试图在其他项目中加载的程序集,并且我已经对路径进行了编码。

谁能帮帮我?

4

7 回答 7

2

动态的:

dynamic obj = Activator.CreateInstance(type);
于 2012-10-10T10:43:22.633 回答
1

你有两个选择:dynamic或者大量的反思。

试试这个:

Assembly assembly = Assembly.LoadFile(assemblyName);
Type type = assembly.GetType("RomanConerter.Converter");
dynamic obj = Activator.CreateInstance(type);

obj.Add("stuff");
于 2012-10-10T10:43:39.500 回答
1

如果您更喜欢使用反射,可以按如下方式使用它:

Type objType = obj.GetType();
objType.InvokeMember("Add", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod,
    null, obj, new object[] { /*comma-separated arguments here*/ });

你可以在这里读到它:Type.InvokeMember

于 2012-10-10T10:46:40.233 回答
1

这一切都取决于RomanConverter.Converter您在调用应用程序中是否可以使用该类型(即包含您发布的代码)。如果是这样,那么您只需投射。

如果没有 - 那么你可以用反射(如其他人所说)或使用后期绑定方法dynamic,但恕我直言,你最好使用公共基础或接口:

/* common interface used in both your code and the external DLL */
public interface ICanAdd {
  object Add(object source);
}

(我猜这里的签名)

然后把你的这个插件类型改成:

namespace RomanConverter {
  public class Converter : ICanAdd {
    object Add(object source){
      //TODO: implement
    }
  }
}

现在,当您从Activator.CreateInstance您那里获取对象时,只需将其转换为ICanAdd

ICanAdd obj = (ICanAdd)Activator.CreateInstance(type);

现在您可以调用该方法。

于 2012-10-10T10:46:41.810 回答
0

您必须明确地转换为您正在创建的类型:

RomanConerter.Converter obj = (RomanConerter.Converter)Activator.CreateInstance(type);
于 2012-10-10T10:42:31.387 回答
0

似乎这可以通过几种方式完成。

  1. 在您的自定义类型中实现一个接口,并在编译时使该接口可用。
  2. 使用dynamic关键字,因为这将为相关对象提供后期绑定。
于 2012-10-10T10:47:23.117 回答
0

如果您不想使用动态(或正在使用 C# 的早期版本),您可以使用一些反射 - 这对于简单的方法调用来说并不太复杂:

obj.GetType().GetMethod("MethodName", System.Reflection.BindingFlags.Public |  System.Reflection.BindingFlags.Instance).Invoke(obj, null);
于 2012-10-10T10:48:12.590 回答