2016-04-15 90 views
0
  • 我有一个通用接口,需要读取和密钥方法。我想使用反射来获取每个实现的实例。
  • 一旦我有了一个实现,我想知道它的关键,并将密钥和实例存储在字典中。
  • 最后,我将有一个方法,我传递一个密钥和字节[],它会查找字典中的关键字,并使用它检索的实例读取字节[]并返回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 
    } 
} 
+0

你不能根据接口'IRead '判断一个实现将有一个无参数的构造函数。那么你怎么知道你可以创建你发现的每种类型的实例呢? –

+0

@ScottHannen我只是想将读者转换成字典中定义的类型 – JacobVoller

+0

看起来您正在寻找某种IoC容器实现。看看[这](http://stackoverflow.com/questions/28509317/get-all-types-that-implement-an-interface-in-unity)的问题和建议的答案。 –

回答

0

请问,当您提出问题时,请邮编编译。它使每个人的生活更轻松(也许你的答案是,因为你写的伪代码是错误的?)

在任何情况下,这将让它们实现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. 制作关键方法是静态的,而不是接口的一部分。
+0

#Rob什么没有编译?如果你不使用C#6.0,也许? – JacobVoller

0

我建议打破这个,因为有一些不同的事情你要做 - 有些是清楚的,有些不是。

首先要得到实现类型的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 
     ); 
} 

现在你已经有了一堆你可以实例化的类型。

从那里它变得相当模糊。你会用这些类型做什么?将它们放入字典中并没有多大用处,因为它们都是不同的类型。