字符串的类属性名称

塞巴斯蒂安·范·多斯特(Sebastian van Dorst)

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

我想使用一个类属性,然后将该属性作为字符串取出!

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

字符串的类属性名称

来自分类Dev

将字符串与类属性名称匹配

来自分类Dev

将字符串与类属性名称匹配

来自分类Dev

仅当子类的名称为字符串时如何访问object.GetType()的子类属性

来自分类Dev

获取完整的类属性“树”名称作为字符串

来自分类Dev

实现保留文档字符串的类属性

来自分类Dev

Ruby / Rails将字符串转换为类属性

来自分类Dev

如何为类属性/元素打印文档字符串?

来自分类Dev

如何从查询字符串初始化类属性?

来自分类Dev

使用传递的字符串访问不同的类属性

来自分类Dev

从字符串数组获取属性名称

来自分类Dev

QML Access对象属性按属性名称字符串

来自分类Dev

根据属性名称的字符串调用属性

来自分类Dev

在魔术引号字符串中回显类属性的语法

来自分类Dev

在php类属性中一起使用字符串和函数

来自分类Dev

我可以在Sphinx autodoc中覆盖特定类属性的文档字符串吗?

来自分类Dev

如何在父类文档字符串中引用子类属性?

来自分类Dev

类属性集删除字符串的一部分

来自分类Dev

如何将类属性应用于HTML字符串(未在文档上呈现)

来自分类Dev

如何使用LINQ将类属性列表转换为字符串?

来自分类Dev

如何使用字符串变量动态选择类属性?

来自分类Dev

C# API 调用:JSON 字符串到类属性(反序列化等)

来自分类Dev

PyMC错误:hasattr():属性名称必须为字符串

来自分类Dev

使用串联字符串作为JavaScript对象属性名称

来自分类Dev

linq orderby使用属性名称字符串

来自分类Dev

使用字符串与属性名称进行角度绑定

来自分类Dev

通过属性名称(字符串值)订购列表?

来自分类Dev

使用属性名称作为字符串排序

来自分类Dev

根据给定的字符串选择属性名称

Related 相关文章

  1. 1

    字符串的类属性名称

  2. 2

    将字符串与类属性名称匹配

  3. 3

    将字符串与类属性名称匹配

  4. 4

    仅当子类的名称为字符串时如何访问object.GetType()的子类属性

  5. 5

    获取完整的类属性“树”名称作为字符串

  6. 6

    实现保留文档字符串的类属性

  7. 7

    Ruby / Rails将字符串转换为类属性

  8. 8

    如何为类属性/元素打印文档字符串?

  9. 9

    如何从查询字符串初始化类属性?

  10. 10

    使用传递的字符串访问不同的类属性

  11. 11

    从字符串数组获取属性名称

  12. 12

    QML Access对象属性按属性名称字符串

  13. 13

    根据属性名称的字符串调用属性

  14. 14

    在魔术引号字符串中回显类属性的语法

  15. 15

    在php类属性中一起使用字符串和函数

  16. 16

    我可以在Sphinx autodoc中覆盖特定类属性的文档字符串吗?

  17. 17

    如何在父类文档字符串中引用子类属性?

  18. 18

    类属性集删除字符串的一部分

  19. 19

    如何将类属性应用于HTML字符串(未在文档上呈现)

  20. 20

    如何使用LINQ将类属性列表转换为字符串?

  21. 21

    如何使用字符串变量动态选择类属性?

  22. 22

    C# API 调用:JSON 字符串到类属性(反序列化等)

  23. 23

    PyMC错误:hasattr():属性名称必须为字符串

  24. 24

    使用串联字符串作为JavaScript对象属性名称

  25. 25

    linq orderby使用属性名称字符串

  26. 26

    使用字符串与属性名称进行角度绑定

  27. 27

    通过属性名称(字符串值)订购列表?

  28. 28

    使用属性名称作为字符串排序

  29. 29

    根据给定的字符串选择属性名称

热门标签

归档