C# 如何调用和调用静态函数的属性?

C# 如何调用和调用静态函数的属性?,c#,C#,我试图理解C#中属性的限制。我想对静态函数应用一个属性,如下所示: 1 public class Simple : System.Attribute 2 { 3 public Simple() { System.Console.WriteLine("Simple ct"); } 4 } ... 5 [Simple] 6 public static void DummyFn() 7 { 8 System.Console.WriteLine("Dummy fn!"); 9 } ... 1

我试图理解C#中属性的限制。我想对静态函数应用一个属性,如下所示:

1 public class Simple : System.Attribute
2 {
3    public Simple() { System.Console.WriteLine("Simple ct"); }
4 }
...
5 [Simple]
6 public static void DummyFn()
7 {
8    System.Console.WriteLine("Dummy fn!");
9 }
...
10 DummyFn();
所以,以下是我想要发生的事情:

  • 第10行调用DummyFn
  • 当调用DummyFn时,将调用Simple()构造函数,它将发出一行“Simple ct”
  • 在调用DummyFn()之后,会发出一行“DummyFn!”

据我所知,这是行不通的。但是,如果我将DummyFn()设为非静态,它确实可以工作。有人能帮我理解这个行为吗?

如果你想构造你的属性,你必须查询元数据

class Program
{
    static void Main(string[] args)
    {
        InvokeTest(new Action(Program.Crap));

        var p = new Program();

        Console.WriteLine(InvokeTest(new Func<int, int>(p.Pipi), 3));
        Console.ReadLine();
    }

    static object InvokeTest(Delegate d, params object[] args)
    {
        d.Method.GetCustomAttributes(typeof(CocoAttribute), false);

        return d.DynamicInvoke(args);
    }

    [Coco]
    static void Crap()
    {
        Console.WriteLine("Caca");
    }

    [Coco]
    int Pipi(int a)
    {
        Console.WriteLine("Pipi: " + a);

        return a * 2;
    }
}

[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
sealed class CocoAttribute : Attribute
{
    // This is a positional argument
    public CocoAttribute()
    {
        Console.WriteLine("Coco");
    }
}

如果要构造属性,则必须查询元数据

class Program
{
    static void Main(string[] args)
    {
        InvokeTest(new Action(Program.Crap));

        var p = new Program();

        Console.WriteLine(InvokeTest(new Func<int, int>(p.Pipi), 3));
        Console.ReadLine();
    }

    static object InvokeTest(Delegate d, params object[] args)
    {
        d.Method.GetCustomAttributes(typeof(CocoAttribute), false);

        return d.DynamicInvoke(args);
    }

    [Coco]
    static void Crap()
    {
        Console.WriteLine("Caca");
    }

    [Coco]
    int Pipi(int a)
    {
        Console.WriteLine("Pipi: " + a);

        return a * 2;
    }
}

[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
sealed class CocoAttribute : Attribute
{
    // This is a positional argument
    public CocoAttribute()
    {
        Console.WriteLine("Coco");
    }
}

您确定调用了
Simple
构造函数吗?它不应该出现在提供的代码中。属性仅在通过类型的元数据进行检查的情况下构造。您是否在任何框架的上下文中工作?不,不调用Simple()。这就是重点。我想知道是否有可能修改这个示例以确保调用Simple():)您已经声明它是在非静态时调用的。斯蒂芬:我想A的观点是,即使
DummyFn()
是一个实例方法(非静态),也不应该调用
Simple()
构造函数,尽管您似乎指出它是这样的……我很确定如果DummyFn()是非静态的,Simple()会被调用。我尝试了两个版本:非静态表单肯定会调用Simple();静态表单没有。您确定调用了
Simple
构造函数吗?它不应该出现在提供的代码中。属性仅在通过类型的元数据进行检查的情况下构造。您是否在任何框架的上下文中工作?不,不调用Simple()。这就是重点。我想知道是否有可能修改这个示例以确保调用Simple():)您已经声明它是在非静态时调用的。斯蒂芬:我想A的观点是,即使
DummyFn()
是一个实例方法(非静态),也不应该调用
Simple()
构造函数,尽管您似乎指出它是这样的……我很确定如果DummyFn()是非静态的,Simple()会被调用。我尝试了两个版本:非静态表单肯定会调用Simple();静态表单没有。哇。。。好吧,我相信你的例子会奏效。伙计,这太激烈了。我希望有更简单的方法…哇。。。好吧,我相信你的例子会奏效。伙计,这太激烈了。我希望有一个更简单的方法。。。