C#如何获取呼叫者的呼叫者成员名称?
我正在尝试实现一个,我希望在这个类的构造函数中自动分配C#如何获取呼叫者的呼叫者成员名称?,c#,C#,我正在尝试实现一个,我希望在这个类的构造函数中自动分配Name字段 下面是我想要改进的工人阶级以及一个示例子类: 公共抽象类枚举:i可比较,其中E:枚举 { 公共只读int-Id; 公共只读字符串名称; 私有静态整数计数; 受保护枚举(字符串名称) { Id=_count++; 名称=名称; } //等 } 公共类颜色:枚举 { 公共只读静态颜色红色=新颜色(1,0,0); 公共只读静态颜色绿色=新颜色(0,1,0); 公共只读静态颜色蓝色=新颜色(0,0,1); 公共只读浮点数; 公共只读浮点
Name
字段
下面是我想要改进的工人阶级以及一个示例子类:
公共抽象类枚举:i可比较,其中E:枚举
{
公共只读int-Id;
公共只读字符串名称;
私有静态整数计数;
受保护枚举(字符串名称)
{
Id=_count++;
名称=名称;
}
//等
}
公共类颜色:枚举
{
公共只读静态颜色红色=新颜色(1,0,0);
公共只读静态颜色绿色=新颜色(0,1,0);
公共只读静态颜色蓝色=新颜色(0,0,1);
公共只读浮点数;
公共只读浮点数;
公共只读浮点B;
专用颜色(浮动r,
浮球g,
浮球b,
//我想把这个移到超级
[CallerMemberName]
字符串名称=”):基(名称)
{
R=R;
G=G;
B=B;
}
//等
}
那么有可能做到这一点吗?这里有一些东西可以免费为您命名,但是您必须使用
int
类型来表示RGB值(不确定为什么要使用float,它们应该是整数):
然而,对我来说,这似乎是一种代码味道,至少在您当前的实现中是这样。我不知道你为什么要创建它,而不是仅仅使用.NET颜色
类型,但这不关我的事
请注意,如果您传递了没有意义的RGB,这将(显然)与ArgumentException
中断。此外,确保考虑未知颜色(这只适用于已知颜色)
祝你好运 这里有一些东西可以免费为您命名,但是您必须使用
int
type作为RGB值(不确定为什么要使用float,它们应该是整数):
然而,对我来说,这似乎是一种代码味道,至少在您当前的实现中是这样。我不知道你为什么要创建它,而不是仅仅使用.NET颜色
类型,但这不关我的事
请注意,如果您传递了没有意义的RGB,这将(显然)与ArgumentException
中断。此外,确保考虑未知颜色(这只适用于已知颜色)
祝你好运 但是你想实现什么呢?在您的示例中,如果我引用
Color.Red.Name
,您想要的值是什么?是的,我的意思是您的代码工作正常。如果这是您所要求的,那么仅在基本摘要枚举类中使用[CallerMemberName]
将不起作用。我希望自动设置名称,就像设置Id
一样[CallerMemberName]
确实在枚举
中不起作用,因为它的调用者是颜色
的构造函数,所以我需要调用者的调用者的成员名。也许我在问[CallerMemberName]
是如何得到它的值的,因为我在堆栈跟踪中找不到信息。这看起来很混乱,因为Color
显然不是枚举,而是一个具有三个属性的类。您还可以拥有一组预定义的颜色,这似乎完全是另一回事。以这种方式隐式递增静态
字段是一个非常糟糕的主意,因为初始值设定项的运行顺序仅在类中定义,即使这样,您也必须知道它是按词法顺序(从上到下)进行的。不幸的是,任何实际使用Id
作为存储在进程单次运行之外的值的人!我可以将Id
重命名为\u hashcode
并将其私有化,但您想实现什么?在您的示例中,如果我引用Color.Red.Name
,您想要的值是什么?是的,我的意思是您的代码工作正常。如果这是您所要求的,那么仅在基本摘要枚举类中使用[CallerMemberName]
将不起作用。我希望自动设置名称,就像设置Id
一样[CallerMemberName]
确实在枚举
中不起作用,因为它的调用者是颜色
的构造函数,所以我需要调用者的调用者的成员名。也许我在问[CallerMemberName]
是如何得到它的值的,因为我在堆栈跟踪中找不到信息。这看起来很混乱,因为Color
显然不是枚举,而是一个具有三个属性的类。您还可以拥有一组预定义的颜色,这似乎完全是另一回事。以这种方式隐式递增静态
字段是一个非常糟糕的主意,因为初始值设定项的运行顺序仅在类中定义,即使这样,您也必须知道它是按词法顺序(从上到下)进行的。不幸的是,任何实际使用Id
作为存储在进程单次运行之外的值的人!我可以将Id
重命名为\u hashcode
并将其私有化我正试图消除手动设置Name
属性的需要,就像Id
一样。@hullabaloonatic:这是实现的内部细节。如果你不设定,谁会设定?你必须在某个时候去做。我已经为您提供了一种方法,可以通过nameof
构造多少实现自动化。正如我在回答中提到的,唯一的另一种选择是保留一个内部颜色字典,您可以根据RGB选择颜色,但这有点代码味道。@Hullabaloontic:我只是想到了其他一些东西。抓紧。我会在几分钟内更新我的答案。@Hullabaloonatic:再看一次。我想这可能就是你想要的。是的,很接近,实际上注释[CallerMemberName]
是ab
private Color(int r, int g, int b):base(System.Drawing.Color.FromArgb(r, g, b).Name)
{
R = r;
G = g;
B = b;
}