c# - 接受 lambda 的方法的实现

标签 c# asp.net-mvc lambda

我有兴趣了解如何在 MVC 中实现接受 lambda 表达式的 LabelFor、EditorFor...方法。

假设我有一个 Person 类,我想打印一个属性的名称和值。必须如何实现 Label() 和 Editor() 方法?

  class Person
  {
     public int Id { get; set; }
  }

  void Label(Expression<Func<Person, int>> expression)
  {
     //...
  }

  void Editor(Expression<Func<Person, int>> expression)
  {
     //...
  }

  public void Test()
  {
     Person p = new Person
     {
        Id = 42
     };

     Label(x => x.Id );  // print "Id"
     Editor(x => x.Id); // print "42"

  }

最佳答案

This answer一个类似的问题给出了 Label 的实现. Josh Smith 在其 MVVM 基金会的 PropertyObserver 类中编写的代码:

    private static string GetPropertyName
        (Expression<Func<TPropertySource, object>> expression)
    {
        var lambda = expression as LambdaExpression;
        MemberExpression memberExpression;
        if (lambda.Body is UnaryExpression)
        {
            var unaryExpression = lambda.Body as UnaryExpression;
            memberExpression = unaryExpression.Operand as MemberExpression;
        }
        else
        {
            memberExpression = lambda.Body as MemberExpression;
        }

        Debug.Assert(memberExpression != null, 
           "Please provide a lambda expression like 'n => n.PropertyName'");

        if (memberExpression != null)
        {
            var propertyInfo = memberExpression.Member as PropertyInfo;

            return propertyInfo.Name;
        }

        return null;
    }

它的工作原理是查看表达式树并检查成员表达式中的属性名称。


对于 Editor ,您可以使用类似的策略来查看 Expression了解您对特性的需求。具体要做什么很大程度上取决于您想要什么信息。

你问它的具体方式你想要的是Person中的属性值,你可以简化很多。我还添加了一个 Person参数,因为您似乎想要给定人的值。

int Editor(Person person, Func<Person, int> expression)
{
    return expression(person);
}

这可以像Editor(p, p => p.Id);一样使用.请注意,我更改了 Expression<Func<Person, int>>Func<Person, int> ,这意味着它得到的不是表达式树 Func .你不能检查 Func查找属性名称等,但您仍然可以使用它从 Person 中查找属性.

关于c# - 接受 lambda 的方法的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32319905/

相关文章:

c# - 将对象集合绑定(bind)到 ListBox

c# - 如何将值分配给变量并将其用于 MVC Razor 中的另一个操作

c# - 更新 ASP .Net MVC 中的记录

lambda - Java 8 流 api 如何将列表收集到对象

c++ - 查找迭代器的值类型

c# - void AjaxManager_AjaxRequest 可以将 JSON 数据发送回浏览器吗?

c# - 您如何查看已注册的 httphandlers 的集合?

c# - 在方法中使用 lambda 并匹配列表

c# - 在 sitecore 中通过管道分隔的 GUID 获取项目集合

c# - 生成具有角色的身份用户(从 Web API 到 MVC 应用程序)