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;
}