私はこの線に沿って何かを持っています:
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 });
}
}
ただし、「ケース」は非表示になっているため、常にnullになります。継承がなければ、考えられるすべてのジェネリック引数を使用して、大きなif-then-elseを作成する必要があります。そして、私を信じてください、私は本当にsomeVar is SomethingandReflectionを使用してこのすべてのオブジェクトを構築する必要があります。これは、他の大きな汎用APIに変換される大きな汎用APIであるため、お互いを認識してはならず、変換は可能な限り透過的である必要があります。