Ech*_*lon 3 c# inheritance interface contravariance
我有反变量接口的问题,我不确定解决它的最佳方法.这些是我的课程:
public interface IObject {
}
public interface IBigObject : IObject {
}
public interface ISmallObject : IObject {
}
public class AnObject : IBigObject {
}
public class DataWrapper<T> {
public T Data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望能够传递一个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;
}
Run Code Online (Sandbox Code Playgroud)
有更短的方式吗?
类在C#中不能有差异,所以你必须创建一个接口,例如
public interface IObjectWrapper<out T> where T : IObject
{
T Value { get; }
}
Run Code Online (Sandbox Code Playgroud)
那你应该可以做到
if(values[1] is IObjectWrapper<IObject>)
{
itemToAdd = ((IObjectWrapper<IObject>)values[1]).Value;
}
Run Code Online (Sandbox Code Playgroud)
如果您不想这样做,可以使用反射:
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)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
130 次 |
最近记录: |