使用自定义属性获取其中一个成员的类

时间:2013-07-26 20:19:50

标签: c# reflection attributes custom-attributes

我有这个自定义属性:

[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. 
    }
}

我在某个地方使用MyAtrribute。

public class Test
{
    [MyAttribute]
    public void MyMethod()
    {
        //method body
    }

    public string Name{get;set;}

    public string LastName{get;set;}
}

我的问题是,我可以从MyAttribute的构造函数中获取测试类的其他成员吗?

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

你不能在属性构造函数中获得有关包含由某些属性修饰的成员的类的任何信息,正如我在此前的答案中已经指出的那样。

Instance to Attribute

但我提出了一个解决方案,即调用属性中的方法而不是使用构造函数,这基本上会得到相同的结果。

我已经通过以下方式重新设计了我之前的答案,以解决您的问题。

您的属性现在需要使用以下方法而不是构造函数。

[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();
    }
}

答案 1 :(得分:0)

不,你不能。您的属性的构造函数不可能知道它装饰方法的类型。

答案 2 :(得分:0)

不,您无法在属性的构造函数中获取任何上下文信息。

属性生命周期也与它们关联的项目非常不同(即,在某人实际请求属性之前不会创建它们。)

有关其他类成员的逻辑的更好的地方是检查类的成员是否已赋予属性的代码(因为此时代码具有关于类/成员的信息)。