我找不到任何文档,或者至少找不到像这样的属性是如何从内部工作的解释。
[CallerMemberName]
[CallerFilePath]
[CallerLineNumber]Documentation I found只展示了如何使用它。
是否可以创建您自己的CallerMemberNameAttribute实现或一些自定义CallerObjectAttribute
这对我来说很有趣,只是为了学习和理解背后的代码。
发布于 2020-07-28 01:23:02
所以只是为了学习的目的。属性本身对方法本身没有任何影响,但对方法的调用方式有影响。
如果编译器必须创建对该方法的调用,它将检查每个参数,如果它具有这些属性之一,如果有,则将调用者的名称或文件作为参数值传递。它会用其他默认值覆盖默认值。将默认参数放在那里的要求只是为了让编译器允许您在第一时间省略此参数。
假设你有这样的代码:
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属性。
https://stackoverflow.com/questions/63119035
复制相似问题