2

我有这个自定义属性:

[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 的构造函数中获取测试类的其他成员吗?

谢谢您的帮助!

4

3 回答 3

1

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

实例到属性

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

我已经修改了我之前的答案,以通过以下方式解决您的问题。

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

[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();
    }
}
于 2013-07-27T10:22:30.500 回答
0

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

于 2013-07-26T20:35:42.637 回答
0

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

属性的生命周期也与它们关联的项目有很大不同(即直到有人真正要求属性时才创建它们)。

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

于 2013-07-26T20:36:05.463 回答