抽象类的IndexerName属性

时间:2011-08-10 01:47:37

标签: c# inheritance attributes

我正在尝试使用我的抽象类上的IndexerName属性重命名我的索引器属性。但它仍显示编译错误“XXX”类型已包含“项目”的定义

抽象类:

public abstract class MyAbstract
{
    [IndexerName("Indexer")]
    public abstract string this[string propertyName]
    {
        get;
    }
}

具体类:

public class MyConcrete : MyAbstract
{
    string item;

    public string Item
    {
        get { return item; }
        set { item = value; }
    }

    public override string this[string propertyName]
    {
        get { return propertyName; }
    }
}

编译错误:

  

“MyConcrete”类型已包含“项目”的定义。

我尝试将IndexerName放在索引器覆盖上并显示错误“无法在标记为覆盖的索引器上设置IndexerName属性”

如何在抽象类上使用IndexerName?

提前致谢。

2 个答案:

答案 0 :(得分:2)

如果您只是将Item重命名为其他内容,则会解决此问题,同时考虑在herehere IndexerName上查看此相关问题。

答案 1 :(得分:2)

似乎编译器在应用属性继承之前检查命名。从IndexerNameAttribute的声明我们可以看到它可以继承到派生类。如果编译器在继承属性准备好后检查命名,则更有意义,因为属性可能会影响名称。也许有一些原因导致编译器团队决定首先检查命名,我不知道。这不是你的错,但我认为要解决你需要更改属性名称Item的问题(即使我知道你不想这样做)。

[AttributeUsage(AttributeTargets.Property, Inherited = true)]
public sealed class IndexerNameAttribute : Attribute

另一种替代解决方案是使用真实方法而不是索引器。

//base abstract class
public abstract string GetItem(string propertyName);
//and implement it in the derived classes