5

この質問に答えType.GetCustomAttributes(true)て、属性が定義されているインターフェイスを実装するクラスで使用しようとしました。GetCustomAttributesインターフェイスで定義された属性が返されないことに驚きました。なぜそうしないのですか?インターフェイスは継承チェーンの一部ではありませんか?

サンプルコード:

[Attr()]
public interface IInterface { }

public class DoesntOverrideAttr : IInterface { }

class Program
{
    static void Main(string[] args)
    {
        foreach (var attr in typeof(DoesntOverrideAttr).GetCustomAttributes(true))
            Console.WriteLine("DoesntOverrideAttr: " + attr.ToString());
    }
}

[AttributeUsage(AttributeTargets.All, Inherited = true)]
public class Attr : Attribute
{
}

出力: なし

4

2 に答える 2

9

実装されたインターフェイスで定義された属性が合理的に継承できるとは思いません。このケースを考えてみましょう:

[AttributeUsage(Inherited=true, AllowMultiple=false)]
public class SomethingAttribute : Attribute {
    public string Value { get; set; }

    public SomethingAttribute(string value) {
        Value = value;
    }
}

[Something("hello")]
public interface A { }

[Something("world")]
public interface B { }

public class C : A, B { }

この属性は倍数が許可されていないことを指定しているため、この状況はどのように処理されると予想されますか?

于 2010-11-10T17:08:12.730 に答える
4

タイプDoesntOverrideAttrにはカスタム属性がないためです。それが実装するインターフェースはそうします(覚えておいてください、クラスはインターフェースから継承されません...それを実装するので、継承チェーンの属性を取得してもインターフェースからの属性は含まれません):

// This code doesn't check to see if the type implements the interface.
// It should.
foreach(var attr in typeof(DoesntOverrideAttr)
                        .GetInterface("IInterface")
                        .GetCustomAttributes(true))
{
    Console.WriteLine("IInterface: " + attr.ToString());
}
于 2010-11-10T17:06:13.770 に答える