使用自定义属性获取其成员之一的类
本文关键字:成员 自定义属性 获取 | 更新日期: 2023-09-27 18:25:17
我有这个自定义属性:
[AttributeUsage(AttributeTargets.Method)]
public class MyAttribute : Attribute
{
public MyAttribute()
{
// I want to get the Test type in here.
// it could be any kind of type that one of its members uses this attribute.
}
}
我在某个地方使用MyAtribute。
public class Test
{
[MyAttribute]
public void MyMethod()
{
//method body
}
public string Name{get;set;}
public string LastName{get;set;}
}
我的问题是,我可以从MyAttribute的构造函数中获取测试类的其他成员吗?
谢谢你的帮助!
正如我在前面的回答中所指出的,在属性构造函数中,您无法获得关于包含由某些属性修饰的成员的类的任何信息。
实例到属性
但我建议了一个解决方案,那就是在属性中调用一个方法,而不是使用构造函数,这基本上会得到相同的结果。
我对之前的答案进行了一些修改,以以下方式解决您的问题。
您的属性现在需要使用以下方法而不是构造函数。
[AttributeUsage(AttributeTargets.Method)]
public class MyAttribute : Attribute
{
public void MyAttributeInvoke(object source)
{
source.GetType()
.GetProperties()
.ToList()
.ForEach(x => Console.WriteLine(x.Name));
}
}
您的Test类需要在其构造函数中包含以下代码。
public class Test
{
public Test()
{
GetType().GetMethods()
.Where(x => x.GetCustomAttributes(true).OfType<MyAttribute>().Any())
.ToList()
.ForEach(x => (x.GetCustomAttributes(true).OfType<MyAttribute>().First() as MyAttribute).MyAttributeInvoke(this));
}
[MyAttribute]
public void MyMethod() { }
public string Name { get; set; }
public string LastName { get; set; }
}
通过运行以下代码行,您将注意到您可以从属性的Test类访问这两个属性。
class Program
{
static void Main()
{
new Test();
Console.Read();
}
}
不,您不能在属性的构造函数中获得任何上下文信息。
属性生存期也与它们所关联的项目非常不同(即,直到有人真正要求属性时才会创建它们)。
更好地了解其他类成员的逻辑的地方是检查类成员是否具有给定属性的代码(因为在这一点上,代码具有关于类/成员的信息)。
不,你不能。属性的构造函数不可能知道它修饰方法的类型。