访问自定义属性中的声明 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; }
}
我创建了一个自定义属性,我想在其中访问自定义属性 属性 的声明 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; }
}