如何调用和调用静态函数的属性
本文关键字:调用 静态函数 属性 何调用 | 更新日期: 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!");
}
}