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