[英]How to use reflection to get implementations of a generic interface
object
。 目标
拥有2条这样存储的字典:
IRead<int> new Reader()
IRead<string> new Reader()
public interface IRead<T>
{
T Read(bool[] binary);
int Key( T type );
}
public class Reader : IRead<int>, IRead<string>
{
int IRead<int>.Read( byte[] binary )
{
// does stuff
returns 4;
}
public int Key( int type ) { return 43; }
string IRead<string>.Read( byte[] binary )
{
// does stuff
returns "example";
}
public int Key( string type ) { return 61; }
static StreamProcessor( )
{
// Here I want to get the definitions
}
}
请,当您提出问题时,请编写可编译的代码。 它使每个人的生活更加轻松(也许您的答案是因为您编写的伪代码是错误的?)
无论如何,这将获得实现IRead<>
所有类型:
var types = GetType().Assembly.GetTypes()
.Select(t => new
{
Type = t,
MatchingInterfaces = t.GetInterfaces()
.Where(i => i.GetGenericTypeDefinition() == typeof(IRead<>))
})
.Where(t => t.MatchingInterfaces.Any())
您返回密钥的先决条件没有多大意义。 您找不到IRead<>
所有实例 。 您需要一个实例来给您一个密钥。
例如,如果您具有以下代码,则字典的外观如何:
var readerOne = new Reader();
var readerTwo = new Reader();
哪个实例进入字典?
您可以得到的最接近的是:
我建议将其分解,因为您要尝试做一些不同的事情-有些事情很清楚,有些不是。
首先,您要获取实现IReader的类型:
public IEnumerable<Type> GetTypes<TAssignableFrom>()
{
return this.GetType().Assembly.GetTypes()
.Where(type => type.IsAssignableFrom(typeof (TAssignableFrom)));
}
您想对这些类型做什么? 如果要创建每种类型的实例,则它们需要具有无参数的构造函数或其他相同的构造函数,或者您需要使用一些依赖项注入容器。
假设他们将拥有无参数的构造函数。 我们可以将以上内容更新为
public IEnumerable<Type> GetTypes<TAssignableFrom>()
{
return this.GetType().Assembly.GetTypes()
.Where(type => type.IsAssignableFrom(typeof (TAssignableFrom))
&& type.GetConstructor(Type.EmptyTypes) != null
);
}
现在,您可以实例化一堆类型。
从那里开始变得很模糊。 您将如何处理这些类型? 将它们放入字典中并没有太大用处,因为它们都是不同的类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.