C#泛型类型转换列表<T>到列表<BaseType>

kay*_*yak 2 c# generics reflection

我怎么能强制转换List<Car>List<MyBaseClass>,在列表中我的代码实例会作为一个对象(程序要求不是故意的),这样做,我会找回vehicleId ..

 public Form1()
    {           
        List<Car> lstCar = new List<Car>();
        lstCar.Add(new Car() { Make = "tootay", Model = "camry", VechicleId = 1 });
        lstCar.Add(new Car() { Make = "honda", Model = "civic", VechicleId = 2 });
        VehicleConverter(lstCar);
    }
    public void VehicleConverter(object obj)
    {
      //Want to typecast it to List<MyBaseClass>            
    }        
}

public class MyBaseClass
{        
    public int VechicleId { get; set; }        
}

public class Car:MyBaseClass
{
    public string Make { get; set; }
}

public class Bike : MyBaseClass
{
    public int CC { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 6

这是不可能的.

如果有可能,您将能够编写以下内容:

List<Car> carList = new List<Car>();
List<BaseClass> baseList = (List<BaseClass>)carList;
baseList.Add(new Bike());    //I just put a Bike into a List<Car>!
Run Code Online (Sandbox Code Playgroud)

备择方案:

  • 将列表声明为 List<BaseCLass>
  • 转换为非泛型IList(不推荐)
  • 投射到IEnumerable<BaseClass>,使用.NET 4中的协方差
  • 传递列表的类型副本:

    VehicleConverter(lstCar.ConvertAll(c => (BaseClass)c));
    
    Run Code Online (Sandbox Code Playgroud)

  • @yoda:那又怎样?这就是为什么他的要求是不可能的. (5认同)
  • @yoda:我意识到了.你不能把`List <Car>`强制转换为`List <BaseClass>`的原因是它允许这个代码. (3认同)
  • @ yodaj007:SLaks是对的.如果用户实际上*是*正在做这件事并不重要.关键是如果转换是合法的,那么他*可以*做那个*并且编译器无法阻止他*.我们可以准确检测到类型安全*的唯一地方*可能*违反*之后*正在进行转换,因此转换是非法的. (3认同)
  • 疑难杂症.我现在正在关注.不要意味着困难; 我只是很慢. (2认同)