我試圖搜索特定的命名空間並返回實現指定接口並具有指定基類的所有類的實例。使用反射來實例化類
下面是代碼
private List<T> GetInstancesWithInterface<T, T2>(string @namespace)
{
var tList = Assembly.GetExecutingAssembly()
.GetTypes()
.Where(t => t.Namespace == @namespace)
.Where(t => t.BaseType == (typeof (T)) && t.GetInterfaces().Contains(typeof(T2)))
.Select(t => (T)Activator.CreateInstance(typeof(T), this))
.ToList();
return tList;
}
這裏是調用代碼
var examples = GetInstancesWithInterface<DrawableGameComponent, IResettable>("GamePhysics.Physics");
foreach (var example in examples)
{
Debug.Assert(example is IResettable);
var r = example as IResettable;
_examples.Add(r);
Components.Add(example);
if (Components.Count == 0) continue;
example.Enabled = false;
example.Visible = false;
}
我遇到的問題是,因爲我回來,不能被視爲的DrawableGameComponent
列表中斷言失敗IResettable
所以代碼var r = example as IResettable
總是返回null。
其他信息
我應該也提到DrawableGameComponent
沒有實現IResettable
接口。我試圖獲取的所有三個示例類都有DrawableGameComponent
作爲基類,它們也實現了IResettable
。
更多的想法
我在想,也許我應該創建一個名爲Example
它實現DrawableGameComponent
和IResettable
,然後我的具體實例類可以直接實現Example
基類一個新的抽象類。我想這可能是更好的設計,但我也有興趣知道,如果我可以得到它的工作。
「因爲我找回了一個不能被視爲IResettable的DrawableGameComponent的列表」 - 我非常懷疑這是問題所在。'is'運營商應該很好地處理這種情況。你是否已經用調試器遍歷它並查看每個返回的對象? –
是的,我已經通過了,r始終爲空。我應該也提到'DrawableGameComponent'沒有實現IResettable接口。我試圖獲取的三個示例類都有DrawableGameComponent作爲基類,它們也實現了IResettable。我會用這個額外的信息更新這個問題。 – Steve
你試過'(typeof(T))。IsAssignableFrom(t.BaseType)'(反之亦然)而不是'如果你正在尋找'T'的子類,那麼'=='很可能不起作用。 – valverij