我已经使用如下属性定义了一个部分类:
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字典的内容。但是,当我建立我得到:
"成员名称不能与其封闭类型相同"
为什么?
答案 0 :(得分: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; } }
}