在一个没有';无法获取泛型类型实例

本文关键字:获取 实例 泛型类型 一个 | 更新日期: 2023-09-27 18:22:38

假设我有一个泛型方法,它被设置为泛型,只是为了返回正确的类型,这样上游调用方就不必强制转换返回值。

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; }
    ...
}

已实现的子类将此属性定义为类常量

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

问题

基于调用的通用方法

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

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

new T();

在我的方法中获得ActualType值。

在一个没有';无法获取泛型类型实例

您需要将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");

根据MSDN关于新约束的文档:

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

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