在C#3.5中获取类型参数约束类的类型

时间:2014-04-08 12:48:56

标签: c# generics types

我正在尝试获取我无法编辑的自定义类的类型,并且它的声明上有一个参数类型约束。就像这样:

public class GenericItemCollection<T> where T : System.IEquatable<T>
{
    public GenericItemCollection();
    public GenericItemCollection(string json);

    public int Count { get; }
    public List<T> Created { get; }
    public List<T> Current { get; }
    public List<T> Deleted { get; }
    public List<T> Original { get; }
    public List<T> Updated { get; }

    public void AcceptChanges();
    public void AddItem(T item);
    public void BindItem(T item);
    public void DeleteItem(T item);
    public void UpdateItem(T item);
}

}

所以我想要的是当T实际上是某种东西时的GenericItemCollection类型。即:

private void MyMethod<T>(GenericItemCollection<T> genericList){
    Type listType = typeof(GenericItemCollection<typeof(T)>);
    //...
}

将被称为:

MyMethod<Foo>(fooGenericList);
MyMethod<Bar>(barGenericList);

在这种情况下,我希望listType为

GenericItemCollection<Foo> 

GenericItemCollection<Bar> 

我知道typeof(T)在运行时之前不会存在但它应该返回一个Type而不管VS只是说“Type expected”

GenericItemCollection<typeof(T)> 

我不是那么精通使用Generics,所以我显然缺少一些东西,我希望你们指出那是什么。非常感谢。

1 个答案:

答案 0 :(得分:1)

首先,对GenericItemCollection的泛型类型参数应用的任何约束也必须应用于MyMethod的泛型类型参数

private void MyMethod<T>(GenericItemCollection<T> genericList) where T: IEquatable<T>

然后,只需将typeof(T)替换为T

Type listType = typeof(GenericItemCollection<T>);