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