gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:23:25 25 4
gpt4 key购买 nike

我有兴趣了解如何在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com