我有这样的事情:
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; }
}
}
注意:在这种情况下不接受覆盖
由于大量使用反射,在某些情况下我不得不沮丧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 });
}
}
但是,因为“案例”是隐藏的,所以它将始终为空。如果没有继承,我将不得不用所有可能的通用参数编写一个 BIG if-then-else。而且,相信我,我确实必须使用someVar is Something和Reflection来构造所有这些对象。这是一个大型通用 API 正在转换为其他大型通用 API,因此它们不应该相互认识,并且转换应该尽可能透明。