我正在尝试搜索特定的命名空间并返回实现指定接口并具有指定基类的所有类的实例。
这是代码
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;
}
我遇到的问题是 Assert 失败,因为我返回了一个DrawableGameComponent
不能被视为的列表,IResettable
因此代码var r = example as IResettable
总是返回 null。
附加信息
我还应该提到DrawableGameComponent
不实现IResettable
接口。我试图获取的三个示例类都DrawableGameComponent
作为基类,它们也实现了IResettable
.
额外的想法
我在想也许我应该创建一个新的抽象类,称为Example
实现DrawableGameComponent
,IResettable
然后我的具体示例类可以只实现Example
基类。我想这可能是更好的设计,但我也很想知道我是否可以让它按原样工作。