c# - 在不获取泛型类型实例的泛型方法中读取具体类属性

标签 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; }

    ...
}

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

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值(value)。

最佳答案

您需要将 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 文档:

The new constraint specifies that any type argument in a generic class declaration must have a public parameterless constructor. To use the new constraint, the type cannot be abstract.

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

关于c# - 在不获取泛型类型实例的泛型方法中读取具体类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25907762/

相关文章:

c# - asp.net MVC 中的 lambda 表达式

c# - 为什么在有泛型返回值时编译器不能推断出泛型参数?

c# - 是否存在类似于 Java 泛型类转换的 C# 泛型类转换?

java - 从java方法返回不同的类型

C++ static const 变量和 ROMable

c# - 如何在我的 .edmx EF 模型中的多个相同模式数据库之间切换?

c# - 是否可以从另一个线程修改内存 'unsafe' ly 中的 WPF BitmapSource

c# - 使用 .net 从 Iothub 配置获取部署 list

c# - 如何在泛型类中映射默认 LINQ 表达式

c# - 在 WCF 请求上下文中存储临时数据