C# 如何从属性的访问器中获取属性的唯一标识符
是否可以从属性的访问器中获取属性的唯一标识符C# 如何从属性的访问器中获取属性的唯一标识符,c#,.net,reflection,C#,.net,Reflection,是否可以从属性的访问器中获取属性的唯一标识符 class Foo { int Bar { set { string nameOfThisProperty = X; // where X == "Bar" or any unique value } } } 如果是,怎么做 更新: 我这样问的原因是:我想要一些一致的唯一值来标识代码正在执行的属性,以避免像我现在这样必须自己声明一个: Dictionar
class Foo
{
int Bar
{
set
{
string nameOfThisProperty = X; // where X == "Bar" or any unique value
}
}
}
如果是,怎么做
更新:
我这样问的原因是:我想要一些一致的唯一值来标识代码正在执行的属性,以避免像我现在这样必须自己声明一个:
Dictionary<string, RelayCommand> _relayCommands
= new Dictionary<string, RelayCommand>();
public ICommand SomeCmd
{
get
{
string commandName = "SomeCmd";
RelayCommand command;
if (_relayCommands.TryGetValue(commandName, out command))
return command;
...
Dictionary\u relayCommands
=新字典();
公共ICommand SomeCmd
{
得到
{
string commandName=“SomeCmd”;
中继命令;
if(_relayCommands.TryGetValue(commandName,out命令))
返回命令;
...
您可以使用反射:
[MethodImpl(MethodImplOptions.NoInlining)]
set
{
string name = MethodBase.GetCurrentMethod().Name;
// TODO: strip the set_ prefix from the name
}
正如注释部分所指出的,setter可以内联,因此必须用[MethodImpl]
属性修饰它,以防止JITer这样做
此外,您还必须从方法名称中去掉set\u
前缀,因为名称将等于set\u条
因此:
有很多方法可以实现这一点。最好的方法取决于您需要它的原因。要实现INotifyPropertyChanged?@Adriano:我更新了我的提问原因。请参阅@empi的帖子,但记住添加MethodImplOptions.NoInLine。如果您使用的是.NET 4.5(或者您知道您会使用它)查看CallerMemberNameAttribute(它甚至在编译时得到解析!)。检查此链接[Get string name of property using reflection][1][1]:该方法将(或可能)内联。他应该将其标记为非内联。如果属性设置器足够简单(几乎总是如此),则返回六个feetsix它将由JIT编译器内联。在这种情况下,当前方法的名称不是set_propertyName,而是调用方的名称。它应该将方法标记为[MethodImpl(MethodImplOptions.NoInLine)]@Adriano,非常好的评论。谢谢你指出这一点。我已经更新了我的答案以将其考虑在内。+1这是在.NET 3.x和4.0中获取属性名的最快方法!@Adriano:当你考虑到不允许内联的影响时,这是最快的方法吗?
string name = MethodBase.GetCurrentMethod().Name.Substring(4);