2016-05-23 11 views
0

私はそれにIDataErrorInfoインターフェイスを実装するカスタム辞書を作成したが、私はこの辞書のインスタンスに値を設定しようとすると:カスタム辞書の読み取り専用プロパティを

カスタム辞書:

public class MyDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IDataErrorInfo 
{ 

    public string Error 
    { 
     get { throw new NotImplementedException(); } 
    } 



    public string this[string columnName] 
    { 
     get { throw new NotImplementedException(); } 
    } 
} 

その後:

MyDictionary<string, string> myDict = new MyDictionary<string, string>(); 
    Dictionary["key"] = "value"; 

私は次のエラーを取得する:

Property or indexer 'MyDictionary.this[string]' cannot be assigned to -- it is read only

私はゲッター/セッターのいくつかの種類がないと思います。しかし、これを基底クラスの辞書から継承してはいけませんか?どうすれば作れますか?

+1

をキャストすることによって、通常のようにDictionaryIDataErrorInfoインデクサーを使用することができます –

答えて

1

問題は、IDataErrorInfothis[string]インデクサーも実装していることです。

public string this[string columnName] 
{ 
    get { ...; } 
} 

あなたがDictionary

((Dictionary<string,string>)variableName)["key"] = "something"; 

またはより良い(相続の問題の1つ)にあなたの変数をキャストする必要がDictionaryのインデクサーにアクセスしたい場合は(以降にあなたがおそらく使うことは決してないだろう手動IDataErrorInfo)、明示的インターフェイスを実装:

string IDataErrorInfo.this[string columnName] 
{ 
    get { return ...; } 
} 

T帽子の方法は、あなたが[MCVE]参考になる

dictionaryVariable["key"] = "something"; 
string error = ((IDataErrorInfo)dictionaryVariable)["key"]; 
0

辞書にはというメソッドがあります。辞書に追加する際に使用するを追加してください。 .Containsを使用して、キーが辞書でまだ使用されていないことを確認することもできます。

+0

しかし、私はすでに実装され、このメソッドを持つクラス「辞書」から延びるよ以来、shouldn」私のカスタムクラスはそれを継承しますか? –

+0

はい。私は質問を誤解した。 Manfred Radlwimmerには正しい答えがあります。 –

関連する問題