在C#中,将泛型类型转换为基类的最佳方法是什么?

时间:2012-11-11 15:20:13

标签: c# generics casting

我有以下对象:

public class ItemChange<T> where T : MyBase
{
public DateTime When { get; set; }
public string Who { get; set; }
public T NewState;
public T OldState;
}

我正在尝试将ItemChange<T>的实例和ItemChange<MyBase>转换为{{1}},但我得到了一个强制转换异常。

无法转换类型的对象。 。

将泛型类型转换为基础calss的正确方法是什么(假设上面的where约束)

2 个答案:

答案 0 :(得分:3)

由于C#中的类不支持协方差,因此无法直接执行此操作。您可以使用接口来执行此操作:

public interface IItemChange<out T> where T : MyBase
{
    DateTime When { get; set; }
    string Who { get; set; }
    T NewState { get; }
    T OldState { get; }
}

public class ItemChange<T> : IItemChange<T> where T : MyBase
{
    public DateTime When { get; set; }
    public string Who { get; set; }
    public T NewState { get; set; }
    public T OldState { get; set; }
}

然后你可以这样做:

IItemChange<MyBase> base = new ItemChange<MySubclass>();

表示MySubclass的某些子类MyBase

答案 1 :(得分:0)

您需要定义一个显式的强制转换运算符。

using System;
using System.Collections.Generic;
using System.Linq;

namespace brosell
{

public class MyBase
{

}



public class ItemChange<T> where T : MyBase
{
    public DateTime When { get; set; }
    public string Who { get; set; }
    public T NewState;
    public T OldState;

    public static explicit operator ItemChange<MyBase>(ItemChange<T> i)
   {
      return new ItemChange<MyBase> { When = i.When, Who = i.Who, NewState = i.NewState, OldState = i.OldState};
   }

}

public class Sub1: MyBase
{

}

public class Sub2: MyBase
{

}

   public class HelloWorld
   {
    public static void Main(string[] args)
    {
        ItemChange<Sub1> item = new ItemChange<Sub1>();


        ItemChange<MyBase> itemCasted = (ItemChange<MyBase>)item;
        }
   } 
}