У меня есть сторонняя плохо спроектированная библиотека, которую я должен использовать.
У него есть все виды типов, с которыми он работает, мы будем называть их SomeType1 , SomeType2 и т. Д.
Ни один из этих типов не имеет общего базового класса, но у всех есть свойство с именем Value с другим типом возвращаемого значения.
Все, что я хочу сделать, - это иметь возможность смешивать этот класс, так что я буду в состоянии вызывать 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 с ISomeType?
Как я могу узнать, что такое параметр типа V? (если бы у меня были typedefs и decltype как в c ++)
Как я могу с минимальным использованием отражения возможно смешивать эти классы с интерфейсом / базовым классом?