2013-05-26 46 views
3

我有一個對變體接口的問題,我不知道解決它的最好方法。這些都是我的課:在C#中的逆變化#

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; 
} 

有一個較短的方法嗎?

回答

5

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) 
} 
+0

好像兩兩害相權較小。將DataWrapper綁定到IObject或使用反射。至少我知道,如果這是語言的限制。謝謝。 – Echilon