c#中的逆变

本文关键字: | 更新日期: 2023-09-27 18:15:18

我有一个逆变接口的问题,我不确定解决它的最佳方法。这些是我的类:

public interface IObject {
}
public interface IBigObject : IObject {
}
public interface ISmallObject : IObject {
}
public class AnObject : IBigObject {
} 
public class DataWrapper<T> {
    public T Data { get; set; }
} 

我希望能够传递一个DataWrapper<IObject>(它可以是一些派生类),并获得项目作为IObject,我能做到这一点的唯一方法,就我所见是这样的:

IObject itemToAdd = null;
if (values[1] is IObject) {
    itemToAdd = values[1] as IObject;
} else if (values[1] is DataWrapper<IObject>) {
    itemToAdd = ((DataWrapper<IObject>)values[1]).Data;
} else if (values[1] is DataWrapper<IBigObject>) {
    itemToAdd = ((DataWrapper<IBigObject>)values[1]).Data;
} else if (values[1] is DataWrapper<BigObjectBase>) {
    itemToAdd = ((DataWrapper<ObservableBigObject>)values[1]).Data;
} else if (values[1] is DataWrapper<ObservableBigObject>) {
    itemToAdd = ((DataWrapper<ObservableBigObject>)values[1]).Data;
} 

有更近的路吗?

c#中的逆变

类在c#中不能有变化,所以你必须创建一个接口,例如

public interface IObjectWrapper<out T> where T : IObject
{
    T Value { get; }
}

那么你应该可以做

if(values[1] is IObjectWrapper<IObject>)
{
    itemToAdd = ((IObjectWrapper<IObject>)values[1]).Value;
}

如果你不想这样做,你可以使用反射:

Type t = values[1].GetType();
if(t.IsGenericType && 
    t.GetGenericTypeDefinition() == typeof(DataWrapper<>) && 
    typeof(IObject).IsAssignableFrom(t.GetGenericArguments()[0]))
{
    itemToAdd = (IObject)t.GetProperty("Data").GetValue(value[0], null)
}
相关文章:
  • 没有找到相关文章