而不是在我的项目中包含一个dll文件作为参考,我需要动态使用该dll文件中特定命名空间的一些类。
我已经对该主题做了一些研究,并通过使用Activator,InvokeMember等找到了解决方法。
但是,我在编写正确的代码时遇到了问题。我需要做类似的事情:
A a = new A();
B[] b = a.method();
B b0 = b[0];
其中A和B是动态加载的dll文件中来自命名空间的类的类型。
我正在尝试调整这段代码:
var DLL = Assembly.Load(path_to_dll);
//here variables to use later
foreach(Type type in DLL.GetTypes())
{
//here checking if type is what I want and:
var c = Activator.CreateInstance(type);
type.InvokeMember("method", BindingFlags.InvokeMethod, null, c, null);
}
我不知道如何使用InvokeMember返回DLL类型中指定的数组。另外,我需要两个未知类型的变量(在运行时已知)在整个方法块中可见。
请给我一些提示。
答案 0 :(得分:0)
正常调用该成员 - 但您可以将结果转换为IList
:
IList array = (IList) type.InvokeMember(...);
object firstElement = array[0];
(所有数组都实现IList
,在这种情况下使用比Array
稍微简单。)
您不能使用实际类型作为变量的类型,因为您在编译时并不知道它。如果您知道该类型将实现您可以访问的某个适当的接口,则可以使用:
IFoo firstElement = (IFoo) array[0];