代码之家  ›  专栏  ›  技术社区  ›  Jason Bunting

我可以从func<t,object>获取特定的元数据吗?

  •  7
  • Jason Bunting  · 技术社区  · 16 年前

    请考虑以下代码:

    string propertyName;
    var dateList = new List<DateTime>() { DateTime.Now };
    propertyName = dateList.GetPropertyName(dateTimeObject => dateTimeObject.Hour);
    
    // I want the propertyName variable to now contain the string "Hour"
    

    下面是扩展方法:

    public static string GetPropertyName<T>(this IList<T> list, Func<T, object> func) {
       //TODO: would like to dynamically determine which 
       // property is being used in the func function/lambda
    }
    

    有办法吗?我想也许这是另一种方法,用 Expression<Func<T, object>> 而不是 Func<T, object> 会给我更多的权力去寻找我需要的东西,但我却不知该如何去寻找。

    public static string GetPropertyName<T>(this IList<T> list, Expression<Func<T, object>> expr) {
       // interrogate expr to get what I want, if possible
    }
    

    这是我第一次对Linq做这么深的事情,所以可能我错过了一些明显的东西。基本上,我喜欢传入lambda的想法,这样我就可以进行编译时检查,但是我不知道在这个特定的情况下如何使用它们的想法是否有效。

    谢谢

    4 回复  |  直到 11 年前
        1
  •  12
  •   nawfal Donny V.    11 年前

    这是我使用的版本,它返回 PropertyInfo 但是,得到这个名字是微不足道的。

    public static PropertyInfo GetProperty<T>(Expression<Func<T, object>> expression)  
    {
        MemberExpression memberExpression = null;
    
        if (expression.Body.NodeType == ExpressionType.Convert)
        {
            memberExpression = ((UnaryExpression) expression.Body).Operand as MemberExpression;
        }
        else if (expression.Body.NodeType == ExpressionType.MemberAccess)
        {
            memberExpression = expression.Body as MemberExpression;
        }
    
        if (memberExpression == null)
        {
            throw new ArgumentException("Not a member access", "expression");
        }
    
        return memberExpression.Member as PropertyInfo;
    }
    
        2
  •  6
  •   Patrick Wolf    15 年前

    在这个博客上,有一个非常简单快捷的方法: http://blog.bittercoder.com/PermaLink,guid,206e64d1-29ae-4362-874b-83f5b103727f.aspx

    因此给出:

    func func=name=> “价值”;

    你可以得到lambda参数 函数委托的“名称” 打电话:

    func.method.getParameters()[0].名称 (将返回“名称”)

    以下是修订后的哈希方法 安德烈:

    public Dictionary<string, T> Hash<T>(params Func<string, T>[] args)
    where T : class
    {
        var items = new Dictionary<string, T>();
        foreach (var func in args)
        {
            var item = func(null);
            items.Add(func.Method.GetParameters()[0].Name, item);
        }
        return items;
    }
    

    希望它有帮助, 帕特里克

        3
  •  3
  •   Nathan W    16 年前

    这样的技巧应该可以做到:

    public static string GetPropertyName<T>(this IList<T> list, Expression<Func<T, object>> expr) {
      MemberExpression member_expression = expr.Body as MemberExpression;
      if (member_expression == null)
          throw new ArgumentNullException("member_expression");
      MemberInfo member = member_expression.Member;
      PropertyInfo property = member as PropertyInfo;
      string proname = memeber.name;
    }
    

    警告:空气代码!

        4
  •  2
  •   AakashM    12 年前

    只是一个旁注: func.method.getParameters()[0].名称 与编译lambda和提取成员表达式、成员信息和名称相比,速度极快。