要转换为string的类属性的名称

Seb*_*rst 2 c# string properties

我无休止地搜索了一个线程,它确切地说明了我的问题,但我找不到它.

我想获取一个类属性,并将该属性作为字符串取出!

public class Foo
{
   public Foo ()
   {
   }
   public int MyProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我想最后得到字符串"MyProperty",如下所示:

Foo f = new Foo();
string s = Helperfunction(f.MyProperty);

string Helperfunction(  X  )
{
   string MyString;
   //do something with X
   return MyString;
}
Run Code Online (Sandbox Code Playgroud)

通过可能的辅助功能来实现这有多困难?所以输出应该是"MyProperty"

因为我不想对它进行硬编码,并且只要我重构属性名称,它就可以在不编辑硬编码字符串的情况下工作!

Eri*_*rer 5

您可以使用反射来获取名称,这是我使用的辅助类:

public static class MemberName
{
    /// <summary>
    /// *** WARNING - Uses reflection - use responsibly ***
    /// </summary>
    /// <param name="instance"></param>
    /// <param name="expression"></param>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    public static string GetMemberName<T>(this T instance, Expression<Func<T, object>> expression)
    {
        return GetMemberName(expression);
    }

    /// <summary>
    /// *** WARNING - Uses reflection - use responsibly ***
    /// </summary>
    /// <param name="expression"></param>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    /// <exception cref="ArgumentException"></exception>
    public static string GetMemberName<T>(Expression<Func<T, object>> expression)
    {
        if (expression == null)
        {
            throw new ArgumentException("The expression cannot be null.");
        }

        return GetMemberName(expression.Body);
    }

    /// <summary>
    /// *** WARNING - Uses reflection - use responsibly ***
    /// </summary>
    /// <param name="instance"></param>
    /// <param name="expression"></param>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    public static string GetMemberName<T>(this T instance, Expression<Action<T>> expression)
    {
        return GetMemberName(expression);
    }

    /// <summary>
    /// *** WARNING - Uses reflection - use responsibly ***
    /// </summary>
    /// <param name="expression"></param>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    /// <exception cref="ArgumentException"></exception>
    public static string GetMemberName<T>(Expression<Action<T>> expression)
    {
        if (expression == null)
        {
            throw new ArgumentException("The expression cannot be null.");
        }

        return GetMemberName(expression.Body);
    }

    private static string GetMemberName(Expression expression)
    {
        if (expression == null)
        {
            throw new ArgumentException("The expression cannot be null.");
        }

        if (expression is MemberExpression)
        {
            // Reference type property or field
            var memberExpression = (MemberExpression)expression;
            return memberExpression.Member.Name;
        }

        if (expression is MethodCallExpression)
        {
            // Reference type method
            var methodCallExpression = (MethodCallExpression)expression;
            return methodCallExpression.Method.Name;
        }

        if (expression is UnaryExpression)
        {
            // Property, field of method returning value type
            var unaryExpression = (UnaryExpression)expression;
            return GetMemberName(unaryExpression);
        }

        throw new ArgumentException("Invalid expression");
    }

    private static string GetMemberName(UnaryExpression unaryExpression)
    {
        if (unaryExpression.Operand is MethodCallExpression)
        {
            var methodExpression = (MethodCallExpression)unaryExpression.Operand;
            return methodExpression.Method.Name;
        }

        return ((MemberExpression)unaryExpression.Operand).Member.Name;
    }
}
Run Code Online (Sandbox Code Playgroud)

并举例说明:

 string propName = MemberName.GetMemberName<Foo>(x => x.MyProperty);
Run Code Online (Sandbox Code Playgroud)