从类型参数

时间:2016-04-25 23:49:34

标签: c# class generics inheritance

我有一个通用控制器,我传递一个只包含属性的类。一切都很好但是......

我想在Controller类中创建另一个继承传递类的类。

有点像这样:

public class Products
{
    public Int32 ProductID {get; set;}
    public String ProductName {get; set;}
}

public class ProductController : Controller<Products>
{
    public ProductsController() : base("Products", "ProductID", "table", "dbo")
    {
    }
}

public class Controller<T> : IDisposable where T : new()
{
    protected Controller(String tablename, String keyname, String entitytype, String tableschema = "dbo")
    {
        ...
    }

    //How do I create the Recordset class inheriting T
    public class Recordset : T   //<----This is what I don't know how to do
    {
        public Int32 myprop {get; set;}

        public void MoveNext()
        {
            //do stuff
        }
    }
}

如何使用T继承创建Recordset类?

3 个答案:

答案 0 :(得分:6)

编译器won't let you do that(因为我确定错误消息告诉你):

  

无法从&#39;标识符&#39;中获取因为它是一个类型参数
  类型参数不能指定泛型类的基类或接口。从特定类或接口或特定泛型类派生,或将未知类型包含为成员。

您可以使用封装而不是继承:

public class Controller<T> : IDisposable where T : new()
{
    public class RecordSet 
    {    
        private T Records;

        public RecordSet(T records)
        {
            Records = records;
        }        

        public void MoveNext()
        {
            // pass through to encapsulated instance
            Records.MoveNext();
        }            
    }
}

答案 1 :(得分:0)

您可以使用Reflection.Emit命名空间下的类来执行此操作。但如果你正在挖掘那么远,你可能会发现你不需要继承。

答案 2 :(得分:0)

public class Controller<T> : IDisposable where T : class, new()
{
    protected Controller(String tablename, String keyname, String entitytype, String tableschema = "dbo")
    {
        ...
    }
   public class Recordset<TT> where TT : class, new()   
    {
        public TT myinheritedclass {get; set}
        public Int32 myprop {get; set;}

        public void MoveNext()
        {
            //do stuff
        }
    }

    public Recordset<T> myRecordset = new Recordset<T>()
}