3

反変インターフェースに問題があり、それを解決する最善の方法がわかりません。これらは私のクラスです:

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

もっと短い方法はありますか?

4

1 に答える 1

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)
}
于 2013-05-26T12:12:32.247 に答える