在没有获得泛型类型实例的泛型方法中读取具体类属性

时间:2014-09-18 08:29:32

标签: c# generics

假设我有一个泛型方法,它只是为了返回正确的类型而通用的,所以上游调用者不必转换返回值。

public T Add<T>(string name, string details, ...)
    where T: BaseClass
{
    // somehow get correct ObjectType
    ObjectType type = ??????;
    T result = Repo.Add<T>(type, name, details, ...);
    ...
    return result;
}

问题

这个泛型方法的问题是我没有得到用泛型类型表示的具体类的实例。这意味着此方法的调用者必须显式提供泛型类型,因为类型推断无法完成。

public abstract class BaseClass
{
    public abstract ObjectType ActualType { get; }

    ...
}

已实现的子类将此属性定义为quasy constant

public class ConcreteClass: BaseClass
{
    public override ObjectType ActualType
    {
        get { return ObjectType.SomeType; }
    }

    ...
}

问题

基于通用方法调用

var result = Add<ConcreteClass>("title", "details");

如何在ActualType方法中获取Add<T>的值?我也尝试添加new()泛型类型约束,但由于我的BaseClass是抽象的,因此无法编译,所以我无法调用

new T();

在我的方法中获取ActualType值。

1 个答案:

答案 0 :(得分:0)

您需要将new()约束应用于Add方法,如下所示:

public T Add<T>(string name, string details)
    where T: BaseClass, new()
{
    T result = new T();
    //snip  
    return result;
}

public abstract class BaseClass { /* snip */ }

public class ConcreteClass: BaseClass { /* snip */ }

这意味着此代码可以正常运行:

var thing = Add<ConcreteClass>("Fred", "Lives in France");

根据new constraint上的MSDN文档:

  

新约束指定泛型类中的任何类型参数   声明必须具有公共无参数构造函数。 使用   新约束,类型不能是抽象的

这是指传入的类型,而不是方法的其他约束。