我找不到任何文档,或者至少找不到这样的属性如何从内部工作的解释。
[CallerMemberName]
[CallerFilePath]
[CallerLineNumber]
我找到的文档仅显示了如何使用它。
是否可以创建您自己的 [CallerMemberNameAttribute] 实现或某些自定义 [CallerObjectAttribute]?
这对我来说很有趣,只是为了学习目的和理解背后的代码。
所以只是为了学习目的。属性本身对方法本身没有任何作用,但对它的调用方式有影响。
如果编译器必须创建对该方法的调用,它会检查每个参数,如果它具有这些属性之一,如果有,它将传递调用者的名称或文件作为参数值。它会用另一个默认值覆盖默认值。放置默认参数的要求只是,让编译器允许您首先省略此参数。
假设你有这样的代码:
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 属性都将被忽略。