假设我有一个泛型方法,它只是为了返回正确的类型而通用的,所以上游调用者不必转换返回值。
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
值。
答案 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文档:
新约束指定泛型类中的任何类型参数 声明必须具有公共无参数构造函数。 使用 新约束,类型不能是抽象的。
这是指传入的类型,而不是方法的其他约束。