2012-12-12 61 views
5

我有這樣定義的部分類屬性:成員名稱不能相同,與部分類的封閉類型

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

,這樣我可以這樣做:

myItem["key"]; 

,並得到Fields字典的內容。但是,當我建立我得到:

「成員名稱不能與它們的封閉類型」

爲什麼?

回答

12

索引器自動具有默認名稱Item - 這是您的包含類的名稱。就CLR而言,索引器只是一個帶參數的屬性,並且不能聲明與包含類相同名稱的屬性,方法等。

一個選項是重命名你的班級,所以它不叫Item。另一種方法是通過[IndexerNameAttribute]更改用於索引器的「屬性」的名稱。破碎的

較短例如:

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

修正了名稱變更:

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

或參數:

using System.Runtime.CompilerServices; 

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

這解釋它。謝謝!我會先看看屬性的方式。 – espvar

+0

對此也感到困惑,謝謝! – Patrick

相關問題