在给定的名称空间下,我有一组实现接口的类。叫它ISomething
。我有另一个类(我们称之为CClass
),它知道ISomething
但不知道实现该接口的类。
我希望CClass
查找的所有实现ISomething
,实例化它的一个实例并执行该方法。
有人对使用C#3.5做到这一点有想法吗?
Answers:
工作代码示例:
var instances = from t in Assembly.GetExecutingAssembly().GetTypes()
where t.GetInterfaces().Contains(typeof(ISomething))
&& t.GetConstructor(Type.EmptyTypes) != null
select Activator.CreateInstance(t) as ISomething;
foreach (var instance in instances)
{
instance.Foo(); // where Foo is a method of ISomething
}
编辑添加了对无参数构造函数的检查,以便对CreateInstance的调用将成功。
使用Linq的示例:
var types =
myAssembly.GetTypes()
.Where(m => m.IsClass && m.GetInterface("IMyInterface") != null);
您可以使用以下内容,并根据需要进行调整。
var _interfaceType = typeof(ISomething);
var currentAssembly = System.Reflection.Assembly.GetExecutingAssembly();
var types = GetType().GetNestedTypes();
foreach (var type in types)
{
if (_interfaceType.IsAssignableFrom(type) && type.IsPublic && !type.IsInterface)
{
ISomething something = (ISomething)currentAssembly.CreateInstance(type.FullName, false);
something.TheMethod();
}
}
该代码可以使用一些性能增强功能,但这只是一个开始。