访问自定义属性中的声明 class?

Access the declaring class in a custom attribute?

我创建了一个自定义属性,我想在其中访问自定义属性 属性 的声明 class。

例如:

public class Dec
{
    [MyCustomAttribute]
    public string Bar {get;set;}
}

在这里我想(在 MyCustomAttribute 的 cass 中)获取声明的类型 class (Dec)。 这有可能吗?

编辑:感谢大家的回复。我今天学到了新东西。

不,它不是 - 除了像 PostSharp、Roslyn 等构建时工具

您需要找到一种不同的方法 - 也许将 Type 作为构造函数参数传入;或者(更有可能),但是无论你想要基于属性的逻辑是什么,都要注意声明上下文;即假设 MyCustomAttribute 有一个 Foo() 方法,使它成为 Foo(Type declaringType) 或类似的方法。

如我所写,只有当您使用 type.GetCustomAttributes() 请求属性时才会实例化,但那时您已经拥有 Type。你唯一能做的就是:

[AttributeUsage(AttributeTargets.Property)]
public class MyCustomAttribute : Attribute 
{
    public void DoSomething(Type t) 
    {

    }
}

public class Dec 
{
    [MyCustomAttribute]
    public string Bar { get; set; }
}

// Start of usage example

Type type = typeof(Dec);
var attributes = type.GetCustomAttributes(true);
var myCustomAttributes = attributes.OfType<MyCustomAttribute>();
// Shorter (no need for the first var attributes line): 
// var myCustomAttributes = Attribute.GetCustomAttributes(type, typeof(MyCustomAttribute), true);


foreach (MyCustomAttribute attr in myCustomAttributes) 
{
    attr.DoSomething(type);
}

所以将类型作为参数传递。

这也可能有效:

class MyCustomAttribute : Attribute
{
    public Type DeclaringType { get; set; }
}

public class Dec
{
    [MyCustomAttribute(DeclaringType=typeof(Dec))]
    public string Bar { get; set; } 
}