2012-12-12 6 views
5

ich eine partielle Klasse mit einer Eigenschaft wie folgt definiert:Mitgliedsnamen können nicht das gleiche wie ihre einschließenden Typ mit Teil Klasse

public partial class Item{  
    public string this[string key] 
    { 
     get 
     { 
      if (Fields == null) return null; 
      if (!Fields.ContainsKey(key)) 
      { 
       var prop = GetType().GetProperty(key); 

       if (prop == null) return null; 

       return prop.GetValue(this, null) as string; 
      } 

      object value = Fields[key]; 

      return value as string; 
     } 
     set 
     { 
      var property = GetType().GetProperty(key); 
      if (property == null) 
      { 
       Fields[key] = value; 
      } 
      else 
      { 
       property.SetValue(this, value, null); 
      } 
     } 
    } 
} 

So dass ich tun kann:

myItem["key"]; 

und erhalten der Inhalt des Fields-Wörterbuchs. Aber wenn ich baue ich bekommen:

„Mitgliedsnamen können nicht das gleiche wie ihre einschließenden Typ sein“

Warum?

Antwort

12

Indexer haben automatisch den Standardnamen Item - was der Name Ihrer enthaltenden Klasse ist. Soweit es die CLR betrifft, ist ein Indexer nur eine Eigenschaft mit Parametern, und Sie können keine Eigenschaft, Methode usw. mit demselben Namen wie die enthaltende Klasse deklarieren.

Eine Möglichkeit besteht darin, Ihre Klasse umzubenennen, damit sie nicht Item heißt. Eine andere wäre, den Namen der "Eigenschaft", die für den Indexer verwendet wird, über [IndexerNameAttribute] zu ändern.

Shorter Beispiel Gebrochen:

class Item 
{ 
    public int this[int x] { get { return 0; } } 
} 

Fest durch Änderung des Namens:

class Wibble 
{ 
    public int this[int x] { get { return 0; } } 
} 

oder Attributen:

using System.Runtime.CompilerServices; 

class Item 
{ 
    [IndexerName("Bob")] 
    public int this[int x] { get { return 0; } } 
} 
+0

Das erklärt. Vielen Dank! Ich werde mir zuerst den Attributweg ansehen. – espvar

+0

So verwirrt darüber auch, danke! – Patrick