【发布时间】:2014-10-23 04:01:57
【问题描述】:
我正在尝试从程序集中创建某种类型。该类型实现了接口IDerrivedInterface,它继承自接口IBaseInterface。所以,我要创建类型的实例,实现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。这种行为的原因是什么?
统一更新:
list - 是简单的 List。我觉得没关系。不会抛出异常。
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 关于另一个错误,但有一个关于在不同上下文中访问两个程序集的问题。也许这是我的情况。因为库(让它成为“L1”)引用了库(L2),其中放置了接口的声明。还有一个库(L3),其中包含类的声明,它实现了 L2 的接口(这就是 L3 也引用 L2 的原因)。所以我在 L1 中调试(它引用了 L2)并加载程序集 L2 和 L3)。也许这就是我遇到这个问题的原因..
【问题讨论】:
-
您是说它进入了
if块并且没有抛出异常,但list不包含该类型? -
只创建您需要类型的实例,不要创建所有类型的实例并选择您的需要。还发布一些重现问题的代码。目前我们无法判断出了什么问题。
-
你的
list是什么对象? -
为什么不在尝试创建它的实例之前检查该类型是否实现了您想要的接口?
-
IMO,这里要看的重要一点是:抛出了什么异常?也许在
catch块中记录ex.Message。另外:list是什么?它是某种简单的列表吗?还是可以做一些自定义的事情,例如:如果是星期五并且月亮在金星,则在请求时不添加项目。
标签: c# interface casting activator