我有以下对象:
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约束)
答案 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;
}
}
}