假设我有一个泛型方法,它只是为了返回正确的类型而变成泛型的,这样上游调用者就不必强制转换返回值。
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/