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 字典的内容。但是当我构建时,我得到:

“成员名称不能与其封闭类型相同”

为什么?

4

1 回答 1

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; } }
}
于 2012-12-12T20:47:56.477 回答