我有A级和B级(只是样本)
public class A
{
public long Id { get; set; }
public string Name { get; set; }
}
public class B : A
{
public B(long id,string name)
{
}
}
想做
var b = new B(100, "myName");
Save(b);
我有一个save方法,我只想允许从A类继承的类型,并且还使用了接受两个参数的构造函数
// I know this will work if my Class B has public B() {},
//but not sure how to restrict to have only the once which accept constructor with two parameters
private void Save<T>(T target) where T : A, new ()
{
//do something
}
答案 0 :(得分:2)
C#类型系统中没有任何内容可以强制执行该约束。您可以使用反射API在运行时验证。
另一种选择是指定工厂:
interface IFactory<T> where T : A {
T Construct(object param1, object param2)
}
class BFactory : IFactory<B> {
public B Construct(object param1, object param2) {
return new B(param1, param2);
}
}
void Save<T>(T target, IFactory<T> tFactory) where T : A {
T newT = tFactory.Construct(a, b);
}
答案 1 :(得分:2)
通用约束不支持带参数的构造函数。大多数情况下使用工厂或创建函数(例如Is there a generic constructor with parameter constraint in C#?),但由于事先创建了对象而您只想过滤允许的对象,因此更安全的方法是实现(空)接口并将其用作约束:
public class A
{
public long Id { get; set; }
public string Name { get; set; }
}
public class B : A, IAmB
{
public B(long id,string name)
{
}
}
public interface IAmB{}
那样的约束就是:
private void Save<T>(T target) where T : A, IAmB
{
}