动态解析通过Reflection加载的程序集中的类型

时间:2012-02-09 12:21:01

标签: c# c#-4.0 reflection

考虑DLL中的以下代码:

public class ReceivingClass
{
    private Assembly myAssembly;
    private Type typeOfClass;
    public ReceivingClass()
    {
        myAssembly = Assembly.LoadFile(@"E:\VSProjects\TestDynamicLinking\MyLib\bin\Debug\MyLib.dll");
        //Can I use this type somehow to resolve the type in the below method?
        typeOfClass = myAssembly.GetType("ExportedClass");
    }
    public bool ReceiveMethod(ExportedClass classobj)
    {
        return true;
    }
}

所以,问题是在上面的ReceiveMethod中,ExportedClass是在我在构造函数中动态加载的程序集中定义的类。那么,我能否以某种方式解析ExportedClass的类型,以便我不必使用dynamic

2 个答案:

答案 0 :(得分:5)

您有一些选择

  • 引用实际的程序集(动态加载时可能不适用于您的情况),
  • 使用该类型实现的共享接口(仅当您可以编辑加载的程序集时),
  • 或使用动态/反射

我通常会使用第二种方法。只需定义ExportedClass在另一个(共享)程序集中实现的接口。然后,您可以尝试将创建的实例强制转换为该接口。那样:

ISomeInterface obj = Activator.CreateInstance(typeOfClass) as ISomeInterface;

当然,这是假设您可以控制引用的库。或者,如果您要定义插件基础结构或类似内容,则应将其作为一项要求包含在内。

答案 1 :(得分:1)

如果您的代码中有方法签名,请执行以下操作:

public bool ReceiveMethod(ExportedClass classobj)
    {
        return true;
    }

这意味着您已经引用了程序集。您无需动态加载它。还有反射你得到的类型。然后,您必须创建该类型的对象。

dynamic只能保存对任何类型对象的引用,但它不会为您实例化该对象。 假设您使用Activator.CreateInstance创建实例,那么您可以轻松地将生成的对象转换为您知道的特定类型。

但是如果您知道特定类型,那么您可能已经引用了程序集,除非您接受该对象的共享接口或基类,但您说该方法接受该程序集中定义的类的对象所以你已经引用了程序集。

如果我认为您的方法签名不是那样,并且您想知道您的选项是什么,那么@ Botz3000表示您可以使用反射,动态或共享界面。