2011-07-22 14 views
1

は私がList<IMyInterface> ...型パラメータ - 型Tからコンクリートの型を取得:IMyInterfaceという

があると、私は3つのIMyInterfaceを実装するクラスがあります:MyClass1MyClass2、および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

私はFunnyClassesのコンストラクタを呼び出し、パラメータ私のMyClassのオブジェクトとして挿入しようとしている

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; 
} 

私は方法があります。私はそれがどのオブジェクトであるかを知りたくありません。パラメータとしてMyClassを使ってFunnyClassをインスタンス化したいだけです。私はConvertToFunnyClassを呼び出すときにいない(TがタイプIMyInterfaceのものであり、私はFunnyInterface<T>にキャストしようとすると、それは私が私の現在の回避策FunnyInterface<IMyInterface>

に、例えば、FunnyClass1を変換することができないと言い、何が起こる

美しい1)は、このです:

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 

には、ありがとうございました変更返信

+0

この例では多くのことが起こっているので、キーポイントを逃した場合は私を許してください。 FunnyClass1はIFunnyInterface を実装していますか? –

+0

'FunnyClass1'は' IFunnyInterface 'を実装しています。 –

答えて

1

FunnyInterface<T>FunnyInterface<IMyInterface>に変換しようとしていることが本質的に問題です。何度か言及されているように(一例はhere、詳細はhere)、これはほとんどの場合有効ではありません。 .NET 4でのみ、ジェネリック型がインターフェイスまたはデリゲートで、型パラメータがinまたはoutのバリアントとして明示的に宣言されている場合は、この変換を実行できますか。

FunnyInterfaceは実際にインターフェイスですか?

+0

私の間違い、FunnyInterface = 'IFunnyInterface'、私は間違っている –

1

thecoopの回答は、あなたがそれを行うことができない理由を正確に示しています。

(動的使用に加えて)問題のクリーナー液は、塩基の非ジェネリックインターフェイスであろう:

public interface IFunnyInterfaceBase 
{ 
} 

public interface IFunnyInteface<T> : IFunnyInterfaceBase 
    where T : IMyInterface 
{ 
} 

、あなたがIFunnyIntefaceからIFunnyInterfaceBaseにそのコードに使用するメソッドのシグネチャを移動する必要があります。

あなたはこのような何かを書くことができるだろう。この方法:

あなたのコードになったあなたが言った例外は、拡張メソッドのシグネチャ自体(メソッドで結構です)に起因しない
MyClass2 c2 = new MyClass2(); 
IFunnyInterfaceBase funnyInstance = c2.ConvertToFunnyClass(); 

..それを左辺値の型(戻り値を格納するために使用する変数の型)によって生成されます。

明らかに、このソリューションは、IFunnyInterfaceソースコードを変更できる場合にのみ適用されます。

+0

+1 Fulvioさん、ありがとうございました。私は.NET 4.0を使っているので、thecoopが提案したソリューションを使用しました。 –