是否可以确定负责在c#中构造属性的类型

时间:2013-05-23 21:38:38

标签: c# .net reflection attributes

在使用属性修饰的类型上调用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的调用者

1 个答案:

答案 0 :(得分: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))]