У меня есть что-то вроде этого:
public class Something
{
private IDictionary<object,Activity> fCases;
public IDictionary<object,Activity> Cases
{
get { return fCases; }
set { fCases = value; }
}
}
public sealed class Something<T> : Something
{
private IDictionary<T,Activity> fCases;
public override IDictionary<T,Activity> Cases
{
get { return fCases; }
set { fCases = value; }
}
}
Примечание: переопределение не принимается в этом случае
Из-за интенсивного использования Reflection существуют ситуации, когдаЯ должен понизить значение с Something<T>
до Something
, но, думаю, поскольку свойство Cases
скрыто, я теряю данные Cases
.
Как я могу обойти эту ситуацию?Я пытался использовать where T:object
, но это также не принимается.
РЕДАКТИРОВАТЬ: Это пример того, почему мне нужно наследование:
if (someVar is Something) {
if (someVar.GetType().IsGenericType)
{
// Construct AnotherObject<T> depending on the Something<T>'s generic argument
Type typeArg = someVar.GetType().GetGenericArguments()[0],
genericDefinition = typeof(AnotherObject<>),
typeToConstruct = genericDefinition.makeGenericType(typeArgs);
object newAnotherObject = Activator.CreateInstance(typeToConstruct);
// Pass Something 'Cases' property to AnotherObject<T>
constructedType.InvokeMember(
"Cases",
BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty,
null,
newActivity,
new Object[] { someVar.Cases });
}
}
Но, потому что "Случаи"скрыт, всегда будет нулевымБез наследования мне пришлось бы написать БОЛЬШОЕ if-then-else со всеми возможными общими аргументами.И, поверьте мне, мне действительно нужно использовать someVar is Something и Reflection для создания всех этих объектов.Это большой универсальный API, конвертируемый в другой большой универсальный API, поэтому они не должны знать друг друга, и конвертация должна быть максимально прозрачной.