2010-12-09 106 views
3

我有一個特殊的需求,我似乎無法弄清楚。我已經做了一些研究,但找不到一個可行的解決方案。獲取適用於任何類別的泛型類型列表

我有一個基類:

public abstract class BaseProvider<T> {} 

這個類依次由兩個不同的供應商類繼承:

public sealed class MonkeyProvider<T> 
     : BaseProvider<MonkeyProvider<T>> 
     where T 
     : IAnimalProvider 

在界面內IAnimalProvider我公開一個屬性,所有的實現必須派生出來。現在,MonkeyProvider也許DonkeyProvider或類似的東西需要知道所分配的值屬性的根實例就是:

public class JoburgZoo 
     : IAnimalProvider 
{ 
    #region IAnimalProvider members 
    public string Id{ get; set; } 
    #endregion 
} 

// somewhere in a console application 
public static void Main(string[] args) 
{ 
    JoburgZoo zoo = new JoburgZoo(); 
    zoo.Id = "Mammals"; 

    **// edit: an instance of the provider will be created** 
    MonkeyProvider<JoburgZoo> mp = new MonkeyProvider<JoburgZoo>(); 
    mp.CheckMonkeys(zoo); // where CheckMonkeys(JoburgZoo) is a method in the provider 
} 

現在,這裏是我的實際問題:

我必須暴露的內部屬性通過BaseProvider實現它的每個實例都可以訪問。這個屬性需要在任何給定的點返回「Id」的值,但我似乎無法通過反射來獲得值(我知道這是對此的解決方案)。

從我的各種徒勞的努力:

Type type = typeof(T); // this returns BaseProvider<MonkeyProvider<T>> 
var generic = type.GetGenericTypeDefinition(); // brings back BaseProvider<T> 

我不能創建T的新實例,它會清除當前分配給對象的所有值。我無法迭代屬性信息集合,因爲這隻會返回BaseProvider的屬性。

感謝您的任何幫助。 Eric

//編輯。 在上面的控制檯主代碼中添加了一個額外的呼叫。的MonkeyProvider<T>模板JoburgZoo實例,所以在ProviderBase<T>它看起來像什麼:

ProviderBase<MonkeyProvider<JoburgZoo>> 

我想知道JoburgZoo的性質是什麼,從BaseProvider<T>內,而不需要識別withing MonkeyProvider<T>的對象。

希望這是有道理的。

+0

你什麼時候創建您的供應商?可能更多的代碼將清除smokey雲? – TalentTuner 2010-12-09 09:06:58

+0

JoburgZoo是一種提供者? – TalentTuner 2010-12-09 09:11:15

回答

2

有了下面的類定義,下面的代碼

class BaseProvider<T> 
    { 
     //... 
    } 

返回System.Int32

 Type type = typeof(BaseProvider<Int32>); 
     foreach (var arg in type.GetGenericArguments()) 
     { 
      MessageBox.Show(arg.FullName); 
     }