获取应用于任何类的通用类型列表

时间:2010-12-09 08:57:30

标签: c# generics reflection

我有一个特别的需要,我似乎无法弄明白。我已经对此做了一些研究,但找不到可行的解决方案。

我有一个基类:

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的属性。

感谢您提供任何帮助。 埃里克

//编辑。 在上面的控制台主代码中添加了一个额外的调用。 MonkeyProvider<T>模板JoburgZoo的实例,所以在ProviderBase<T>中它看起来像:

ProviderBase<MonkeyProvider<JoburgZoo>>

我想知道JoburgZoo的属性是什么,来自BaseProvider<T>,而无需使用MonkeyProvider<T>来识别对象。

希望这是有道理的。

1 个答案:

答案 0 :(得分:2)

使用以下类定义

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

以下代码返回System.Int32

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