私が持っているとしましょうList<IMyInterface>
...
、、、を実装する 3 つのクラスがありますIMyInterface
。MyClass1
MyClass2
MyClass3
私は読み取り専用の辞書を持っています:
private static readonly Dictionary<Type, Type> DeclarationTypes = new Dictionary<Type, Type>
{
{ typeof(MyClass1), typeof(FunnyClass1) },
{ typeof(MyClass2), typeof(FunnyClass2) },
{ typeof(MyClass3), typeof(FunnyClass3) },
};
私は別のインターフェースを持っています、IFunnyInteface<T> where T : IMyInterface
私は方法を持っています:
public static IFunnyInterface<T> ConvertToFunnyClass<T>(this T node) where T : IMyInterface
{
if (DeclarationTypes.ContainsKey(node.GetType())) {
IFunnyInterface<T> otherClassInstance = (FunnyInterface<T>) Activator.CreateInstance(DeclarationTypes[node.GetType()], node);
return otherClassInstance;
}
return null;
}
FunnyClasses のコンストラクターを呼び出して、パラメーターとして MyClass オブジェクトを挿入しようとしています。それがどのオブジェクトかは知りたくありません。 MyClass をパラメーターとして使用して FunnyClass をインスタンス化したいだけです。
ConvertToFunnyClass を呼び出すとどうなるかT
、タイプは IMyInterface
であり、それを にキャストしようとすると、たとえば にFunnyInterface<T>
変換できないと表示されますFunnyClass1
FunnyInterface<IMyInterface>
私の現在の回避策(美しいものではありません)は次のとおりです。
public static dynamic ConvertToFunnyClass<T>(this T node) where T : IMyInterface
{
if (DeclarationTypes.ContainsKey(node.GetType())) {
var otherClassInstance = (FunnyInterface<T>) Activator.CreateInstance(DeclarationTypes[node.GetType()], node);
return otherClassInstance;
}
return null;
}
そして、戻り値の型がdynamic
であるため、私はそれが好きではありません。そのため、別の場所からアクセスすると、それがどの型であるかがわかりません。インテリセンスなどが失われます。パフォーマンスへの影響についてもわかりません。
手がかりはありますか?
前もって感謝します!
解像度
私は C# 4.0 を使用しているので、共分散 (出力位置のみ) を使用してエラーのキャストを停止できたのでIFunnyInterface
、
IFunnyInteface<out T> where T : IMyInterface
返信ありがとうございます。