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

本文关键字:调用 静态函数 属性 何调用 | 更新日期: 2023-09-27 18:14:37

我试图理解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()被调用,它发出一行"Dummy fn!"

据我所知,这不起作用。但是,如果我将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");
    }
}

这个程序将显示椰子树新泽西州椰子树皮皮:36

——经你的允许,弗朗西斯,我编辑了你的答案。

这行不通

class Program
{
    static void Main()
    {
        new Program().DummyFn();
    }
    public class Simple : System.Attribute
    {
        public Simple()
        {
            System.Console.WriteLine("Simple ct");
        }
    }
    [Simple]
    public void DummyFn()
    {
        System.Console.WriteLine("Dummy fn!");
    }
}