c# - 类属性的名称到字符串

标签 c# string properties

我一直在无休止地寻找能准确说明我的问题的话题,但找不到。

我想取一个类的属性,只是把属性作为字符串取出来!

public class Foo
{
   public Foo ()
   {
   }
   public int MyProperty { get; set; }
}

然后我想在最后有字符串“MyProperty”,像这样:

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

string Helperfunction(  X  )
{
   string MyString;
   //do something with X
   return MyString;
}

仅使用辅助函数实现这有多困难? 所以输出应该是“MyProperty”

因为我不想对其进行硬编码,一旦我重构属性名称,它仍然可以在不编辑硬编码字符串的情况下工作!

最佳答案

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

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

还有一个用法示例:

 string propName = MemberName.GetMemberName<Foo>(x => x.MyProperty);

关于c# - 类属性的名称到字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24411333/

相关文章:

javascript - 将包含 python 列表的字符串转换为 javascript 数组

c# - 当属性名匹配类名时怎么办

performance - 在大量字符串中查找重复的长子字符串

r - 识别和计算R中逗号分隔字符串中的 "correct"个字母

javascript - 当频繁访问对象的属性时,缓存是否有效?

java - 让 Spring 替换不同文件类型中的占位符(除了 Spring 的配置)

c# - 部署到 GAC

c# - 如何在 C# 中制作这种类型的选择文件夹对话框?

c# - 如何使用 Mongodb/Couchdb 创建我的 DDD 实体?

c# - 为什么我的泛型约束仍然需要转换?