使用しなければならないサードパーティ製の不適切な設計のライブラリがあります。
動作するすべての種類の型があり、それらをSomeType1、SomeType2などと呼びます。
これらの型はどれも共通の基本クラスを共有していませんが、すべてが異なる戻り値の型を持つ Value という名前のプロパティを持っています。
私がやりたいのは、このクラスを Mixin できるようにすることだけです。そのため、concreate 型が何であるかを気にせずに、戻り型が何であるかを気にせずに呼び出すことができます (使用できますsomeType1Instance.Value
) 。
だから私のコードは現在: someType2Instance.Value
object
public interface ISomeType<V>
{
V Value {get; set;}
}
public interface ISomeTypeWrapper
{
object Value { get; set; }
}
public class SomeTypeWrapper<T> : ISomeTypeWrapper
where T : ISomeType<???>
{
T someType;
public SomeTypeWrapper(T wrappedSomeType)
{
someType = wrappedSomeType
}
public object Value
{
get { return someType.Value; }
set { someType.Value = value != null ? value : default(T); }
}
}
public class SomeType1
{
public int Value { get; set; }
}
public class SomeType2
{
public string Value { get; set; }
}
問題は、オブジェクトの辞書を取得するという事実のために、実行時まで T が何であるかわからないことです。
辞書を反復処理し、リフレクションを使用して実行時に SomeWrapperType を作成できますが、それは避けたいと思います。
SomeType の concreate 型を ISomeType に混在させるにはどうすればよいですか?
V 型パラメータが何であるかを知るにはどうすればよいですか? (C++ のように typedef と decltype があればいいのに)
リフレクションの使用を最小限に抑えて、これらのクラスとインターフェイス/基本クラスを混在させるにはどうすればよいですか?