0

我有这个简单的程序,问题是代码永远不会到达 TestClassAttribute 类。控制台输出为:

init
executed
end

编码

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("init");
        var test = new Test();
        test.foo();
        Console.WriteLine("end");
        Console.ReadKey();
    }
    public class TestClassAttribute : Attribute
    {
        public TestClassAttribute()
        {
            Console.WriteLine("AttrClass");
            Console.WriteLine("I am here. I'm the attribute constructor!");
            Console.ReadLine();
        }
    }

    public class Test
    {
        [TestClass]
        public void foo()
        {
            Console.WriteLine("executed");
        }
    }
}
4

4 回答 4

3

您可能应该阅读属性类如何工作?.

当您创建应用它们的对象时,它们不会被实例化,不是一个静态实例,不是每个对象实例 1 个。他们也没有访问他们所应用的类..

您可以尝试获取类、方法、属性等的属性列表。当您获得这些属性的列表时 - 这就是它们将被实例化的地方。然后您可以对这些属性中的数据进行操作。

于 2013-06-26T20:03:21.763 回答
2

属性本身不会做任何事情。在要求特定类/方法的属性之前,它们甚至都没有被构建。

因此,要让您的代码编写“AttrClass”,您需要foo明确要求方法的属性。

于 2013-06-26T20:03:51.057 回答
1

属性被延迟实例化。您必须获取属性才能调用构造函数。

var attr = test.GetType().GetMethod("foo")
            .GetCustomAttributes(typeof(TestClassAttribute), false)
            .FirstOrDefault();
于 2013-06-26T20:18:16.937 回答
0

不,不。属性很特殊。在您使用反射来获取它们之前,它们的构造函数不会运行。那时他们不需要跑。例如,这个小方法反映到属性中:

public static string RunAttributeConstructor<TType>(TType value)
{
    Type type = value.GetType();
    var attributes = type.GetCustomAttributes(typeof(TestClassAttribute), false);
}

您将看到在Main属性的构造函数中调用它的任何位置都会运行。

于 2013-06-26T20:07:08.450 回答