C#泛型方法 - 在类型上调用基类构造函数

时间:2013-02-03 11:30:58

标签: c# generics visual-studio-2012

我有一个名为CAR的Object声明如下:

public class Car{
   public int NumberOfWheels;
}  

并使用另一个类我可以检索其三个子类 如下:

public TruckA getCarA(int param){
   return new TruckA () {NumberOfWheels = param} 
}
public TruckB getCarB(int param){
   return new TruckB () {NumberOfWheels = param} 
}
public TruckC getCarC(int param){
   return new TruckC () {NumberOfWheels = param} 
}

如何使用泛型编写?
(我知道这太简单了,我需要一个更复杂案例的例子)

我想创建一个创建新(T)的方法,输入参数并返回它。

类似

public TruckC getCarC(int param){
   return getTruck<TruckC>(param)
}

仅限于此:
1. TruckA / B / C没有构造函数 汽车没有建设者。使用{}初始化 3.该方法应仅接收从Car派生的类,以便它可以使用其初始化({})。

(相当于??扩展?在java泛型中的东西)
有可能?

感谢。

3 个答案:

答案 0 :(得分:9)

private static T GetTruck<T>(int param) where T : Car, new()
{
    return new T() {NumberOfWheels = param} ;
}

答案 1 :(得分:1)

试试这个:

public T getCarC<T>(int param) where T : Car, new()
        {
            T truck=new T();
            truck.NumberOfWheels = param;

            return track;
        }

泛型是C#2.0最强大的功能。泛型允许您定义类型安全的数据结构,而无需提交实际的数据类型。

从泛型基类派生时,必须提供类型参数而不是基类的泛型类型参数:

public class BaseClass<T>
{...}
public class SubClass : BaseClass<int>
{...}

如果子类是通用的,而不是具体的类型参数,则可以使用子类泛型类型参数作为通用基类的指定类型:

public class SubClass<T> : BaseClass<T> 
{...}

使用子类泛型类型参数时,必须重复子类级别的基类级别规定的任何约束。例如,派生约束:

public class BaseClass<T>  where T : ISomeInterface 
{...}
public class SubClass<T> : BaseClass<T> where T : ISomeInterface
{...}

或构造函数约束:

public class BaseClass<T>  where T : new()
{   
   public T SomeMethod()
   {
      return new T();
   }
}
public class SubClass<T> : BaseClass<T> where T : new() 
{...}

答案 2 :(得分:1)

您需要使用泛型类型约束来执行此操作。这些允许您对传递的类型提出要求。

它看起来像这样:

public static T GetCar<T>(int param)
    where T : Car, new() // Must inherit from Car, must have a parameterless constructor
{
    return new T() { NumberOfWheels = param };
}