繁体   English   中英

如何使用反射获取通用接口的实现

[英]How to use reflection to get implementations of a generic interface

  • 我有一个通用的接口,需要一个读和键方法。 我想使用反射来获取每个实现的实例。
  • 有了实现后,我想获取它的密钥并将密钥和实例存储在字典中。
  • 最终,我将拥有一个传递键和byte []的方法,它将在字典中查找键,并使用它检索的实例读取byte []并返回一个object
  • 我希望这是可以理解的,否则我可以在评论中回答问题。
  • 这个例子只有int和string,但是在我的实际实现中我将有更多类型。

目标

拥有2条这样存储的字典:

  • 43, IRead<int> new Reader()
  • 61, 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();

哪个实例进入字典?

您可以得到的最接近的是:

  1. 向方法传递对象列表并返回这些实例的键
  2. 创建每种类型的虚拟实例以获取密钥
  3. 将key方法设为静态,而不是接口的一部分。

我建议将其分解,因为您要尝试做一些不同的事情-有些事情很清楚,有些不是。

首先,您要获取实现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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM