CallerMemberName 在内部如何工作?

问题描述 投票:0回答:1

我找不到任何文档,或者至少找不到这样的属性如何从内部工作的解释。

    [CallerMemberName] 
    [CallerFilePath] 
    [CallerLineNumber]

我找到的文档仅显示了如何使用它。

是否可以创建您自己的 [CallerMemberNameAttribute] 实现或某些自定义 [CallerObjectAttribute]?

这对我来说很有趣,只是为了学习目的和理解背后的代码。

c# attributes
1个回答
3
投票

所以只是为了学习目的。属性本身对方法本身没有任何作用,但对它的调用方式有影响。

如果编译器必须创建对该方法的调用,它会检查每个参数,如果它具有这些属性之一,如果有,它将传递调用者的名称或文件作为参数值。它会用另一个默认值覆盖默认值。放置默认参数的要求只是,让编译器允许您首先省略此参数。

假设你有这样的代码:

   static void Main(string[] args)
    {
        Test();
        Test1();
    }

    public static void Test(string name = "")
    {
        Console.WriteLine(name);
    }

    public static void Test1([CallerMemberName] string name = "")
    {
        Console.WriteLine(name);
    }

生成的代码与

相同
  static void Main(string[] args)
    {
        Test("");
        Test1("Main");
    }

无论如何,您都无法通过编程来模拟这一点,除非您修改编译器本身。如果调用者的编译器找到此属性,则将其放入此“Main”字符串(或当前编译的文件的名称)。

如果显式传递参数值(如代码示例的最后一行所示),则默认值和 CallerMemberName 属性都将被忽略。

© www.soinside.com 2019 - 2024. All rights reserved.