我正在尝试创建一个方法签名,使用
获取各种类型的多个属性我会这样称呼:
AllPropertiesExcept(() => Property1, () => Property2)
除了属性的类型必须相同之外,此方法几乎可以工作。我只会使用属性名称,但希望使用lambda表达式来实现轻松的重构。
public static string MyMethod<T>(params Expression<Func<T>>[] propertyExpression)
答案 0 :(得分:3)
我会使用AllPropertiesExcept(params Expression<Func<object>>[] properties)
,您仍然可以从中获取属性名称,但属性的类型并不重要。
编辑:但是,我倾向于反过来使用它 - 而不是排除我不想看到的属性,我会包含我想要看到的属性。原因很简单 - 为了让你的方式有效,你仍然需要反思 - 用我的方式,你可以轻松地使用Func
直接获得实际数据。
编辑2(从表达式中获取属性名称):
Expression<Func<object>> obj = something; // you get this in your method
((obj.Body as UnaryExpression).Operand as MemberExpression).Member.Name
我真的可以建议您使用LinqPad进行此类操作,您可以通过Dump()
轻松地向下钻取对象,这会显示非常用户友好的对象。只需重新创建一个小例子和实验。
答案 1 :(得分:2)
方法AllPropertiesExcept()
是否会返回任何内容?否则你可以建立一个流畅的界面(使用方法链接):
AllPropertiesExcept(() => Property1)
.And(() => Property2)
.And(() => Property3);
即使AllPropertiesExcept()
方法返回某些内容,您也可以推迟执行,直到您在方法链的末尾调用方法:
var foo = AllPropertiesExcept(() => Property1)
.And(() => Property2)
.And(() => Property3)
.DoSomeThing();
答案 2 :(得分:0)
我认为您需要了解此处记录的ModelMetadata类: http://msdn.microsoft.com/en-us/library/system.web.mvc.modelmetadata.aspx
在Html.LabelFor(x - &gt; x.Name)等情况下,此类在ASP.NET MVC中使用 表达式传递给此处记录的ModelMetadata.FromLambdaExpression方法: http://msdn.microsoft.com/en-us/library/ee428393.aspx
在了解了如何在MVC中使用它之后,您可以创建自己的代码,并了解它在其他地方的应用方式。