我想从程序集中创建一些类型。该类型实现了从接口IBaseInterface
继承的接口IDerrivedInterface
。所以,我要创建类型的实例,实现IBaseInterface
:类型铸造的奇怪行为
if (assembly != null)
{
ObjTypes = assembly.GetTypes();
foreach (var objType in ObjTypes)
{
try
{
var type = Activator.CreateInstance(objType);
if (type is IBaseInterface)
{
list.Add((IBaseInterface) type);
}
}
catch (Exception ex)
{
int a = 0;
}
}
}
有型,它实现了在assembly
IDerrivedInterface
。但是代码行list.Add((IBaseInterface) type)
未被执行。我试图调试:我添加type is IBaseInterface
到“手表”,该值为True
。这种行为的原因是什么?
UPD: list - is simple列表<>。我认为这并不重要。没有例外被抛出。 IDerrived
接口从IBaseInterface
继承:
interface IBaseInterface
{
//
}
interface IDerrivedInterface : IBaseInterface
{
}
//and a class in assembly:
class SomeType : IDerrivedInterface
{
}
UPD2: 该组件从一些文件夹加载。该文件夹中有几个程序集和其他几个文件。我遍历所有带有“.dll”扩展名的文件。然后我收集所有类型实现IBaseInterface
的对象到列表中。我的类型(实现IBaseInterface
)和IBaseInterface
的声明放置在不同的程序集中。 因此,如果没有装配(其中包含IBaseInterface
的声明),它就可以工作。但是,如果有该组件(并且在使用Type组装之前处理它),它不起作用。
UPD3: 有几种不同的接口来实现这种类型。此外,该类型衍生自一些BaseClass
。它应该工作,但它不..
关于另一个错误,这里是some question,但有一个aswer关于在不同的上下文中访问两个程序集。也许这是我的情况。因为图书馆(让它成为“L1”)引用了图书馆(L2),在那里放置界面的声明。还有一个库(L3),它包含类的声明,它实现了L2的接口(也就是为什么L3也参考L2)。所以我正在调试L1(它有L2的参考),它加载了组件L2和L3)。也许这就是为什么我有这个问题..
你是说它进入'if'块并且不会抛出异常,但'list'不包含类型? – SimpleVar 2014-08-29 07:09:53
只能创建您需要**的类型的实例,不要创建所有类型的实例并选择您的需要。同时发布一些代码来重现问题。在这一刻,我们不能说出什么是错的。 – 2014-08-29 07:10:07
你的“列表”是什么类型的对象? – Marwie 2014-08-29 07:10:18