2

GetCustomAttributes()在调用用属性修饰的类型之后调用属性构造函数。是否可以从构造函数中确定调用类型。我想做类似于以下的事情并且不要抛出。

class Program
{
    static void Main(string[] args)
    {
        var myAttributedClassType = typeof(MyAttributedClass);
        var customAttributes = myAttributedClassType.GetCustomAttributes(false)
                                                    .OfType<MyAttribute>();
        if (customAttributes.Any(x => x.CallingType != myAttributedClassType))
        {
            throw new Exception("MyAttribute.CallingType was incorrect.");
        }
    }
}

[AttributeUsage(AttributeTargets.Class)]
class MyAttribute : Attribute
{
    public Type CallingType { get; set; }

    public MyAttribute()
    {
        // magic to set CallingType goes here
    }
}

[MyAttribute]
class MyAttributedClass { }

更新:

我知道这可以通过构造函数中的命名参数轻松完成

[MyAttribute(CallingType = typeof(MyAttributedClass)

或必需的参数

public MyAttributed(Type callingType)
{
    CallingType = callingType;    // this doesn't qualify as magic ;)
}

但希望有一种方法可以避免它,因为类型对象本身(我想要的值)是调用者GetCustomAttributes

4

1 回答 1

0

你的魔法,虽然不是真正的魔法:

[AttributeUsage(AttributeTargets.Class)]
class MyAttribute : Attribute
{
    public Type CallingType { get; set; }

    public MyAttribute(Type type)
    {
       // heres your magic
       this.CallingType = type;
    }
}

用法:

[MyAttribute(typeof(MyClass))]
于 2013-05-23T21:46:10.463 回答