仅允许从类继承的类型

时间:2016-02-24 16:45:12

标签: c# .net .net-4.5

我有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
 }

2 个答案:

答案 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
 {

 }