2012-01-27 16 views
2

のIDictionary <文字列、インターフェイス>に私は、パラメータの辞書を保持しているクラスがあります。キャスト辞書<文字列、クラス>

public class Parameter : IExecutionParameter, IDesignerParameter 
{ 
} 

public interface IExecutionSettings 
{ 
    IDictionary<string, IExecutionParameter> Parameters { get; } 
} 

public interface IDesignerSettings 
{ 
    IDictionary<string, IDesignerParameter> Parameters { get; } 
} 

public class Settings : IExecutionSettings, IDesignerSettings 
{ 
    private Dictionary<string, Parameter> _parameters; 

    // TODO: Implement IExecutionSettings.Parameters 
    // TODO: Implement IDesignerSettings.Parameters 
} 

を私は、これらのインタフェースの明示的な実装を作成する(この私がどのように知っていますdo)、しかし私は辞書を適切にキャストする方法を理解できません。

ご協力いただければ幸いです。

+0

ユーザーが取得したIDictionaryのうちの1つに何かを追加した場合、それも 'Dictionary'に追加する必要がありますか? – Krizz

+0

はい、これが意図でしたが、Jon Skeet氏が指摘しているように、特定のインターフェイスを実装するものはすべて、インターフェイスの有効な値になりますが、基礎となるストアではありません。 –

答えて

4

安全ではないため、できません。 Dictionary<string, MemoryStream>IDictionary<string, IDisposable>にキャストできたら、実際の辞書にはMemoryStream互換の参照のみを保持できますが、のいずれかをIDisposableの値を辞書に入れることができます。

潜在的に、すべての読み取りのために基礎となる辞書に委任し、すべての書き込みで失敗する読み取り専用辞書ラッパーを作成できます。 Dictionary<string, Parameter>を2つの「ビュー」辞書にラップすることができます。それは少し痛みですが、できる。それがあなたのケースで最も適切なアプローチであるかどうかは、別の問題です。

おそらく、代わりにあなたが持っている必要があります。

public interface IExecutionSettings 
{ 
    IExecutionParameter this[string key] { get; } 
} 

public interface IDesignerSettings 
{ 
    IDesignerParameter this[string key] { get; } 
} 

あなたは簡単にSettings内(明示的に)それらの両方を実装することができます。

+0

これは非常に良い点です!私はそれについて考えなかった。ありがとうございました! –

+0

この代替策は、リスクを負う可能性があります:これらの2つの基本インターフェースを作成し、そのインターフェースを値タイプとして使用するように辞書を設定します: 'Dictionary 'および 'Interface IParameter:IExecutionParameter、IDesignerParameter'、am私はここでうまくいっている? –

+0

Nope。これは何も成し遂げられないことに気がつきました。私はおそらく、特定の項目が両方のプロパティーのために両方のインターフェースを実装しているかどうかをチェックすることができますが、これは容易に制御不能になります。私はインデクサーを介して読み取り専用のアプローチをとっていますが、これは私のシナリオではうまくいくと思います。再度、感謝します! –

関連する問題