簡體   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