我想從程序集中創建一些類型。該類型實現了從接口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