C#怎么把静态属性类的属性名转为字符串啊?

public static class AttrClass
{
    private static string a="a1";
    [Description("A1中文名")]
    public static string A1
    {
        get{return a;}
        set{a=value;}
    }
}

我想根据属性名A1获取PropName值?
string propName=GetPropName(AttrClass.A1);
然后我不知道下面这个GetPropName里的方法怎么写了才能获取"A1"这个字符串,请大神们帮忙一下,谢谢!

阅读 3.1k
2 个回答

直接用 GetPropName(AttrClass.A1) 肯定是取不到它的名字的,因为这里你实际是传入的 A1 的值(或引用)。

如果要取名字,可以用表达式来取,比如

https://dotnetfiddle.net/g3D9Bl

using System;
using System.ComponentModel;
using System.Linq.Expressions;
using static System.Console;

public class Program
{
    public static void Main()
    {
        WriteLine(GetPropName(() => AttrClass.A1));   // 输出 A1
    }
    
    static string GetPropName<T>(Expression<Func<T>> expression) {
        MemberExpression expr = (MemberExpression) expression.Body;
        return expr.Member.Name;
    }
}

public static class AttrClass
{
    private static string a="a1";
    [Description("A1中文名")]
    public static string A1
    {
        get{return a;}
        set{a=value;}
    }
}

下面的代码应该是你要的答案。

using System;
using System.ComponentModel;
using System.Reflection;

public static class AttrClass
{
    private static string a="a1";
    [Description("A1中文名")]
    public static string A1
    {
        get{return a;}
        set{a=value;}
    }
}

public static string GetPropName(string propertyName)
{
  var property = typeof(AttrClass).GetProperty(propertyName);
  var value = property.GetGetMethod().Invoke(null, null);
  
  return value?.ToString();
}

Console.WriteLine(GetPropName(nameof(AttrClass.A1)));
/*
输出:
a1
*/
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进