我试图创建一个使用C#多表达parameteres
我只能说这是这样一个方法签名采取各种类型的多个属性:
AllPropertiesExcept(() => Property1,() => Property2)
这种方法几乎工作,但属性的类型必须相同。我只打算使用属性名称,但希望使用lambda表达式来实现轻松重构。
public static string MyMethod<T>(params Expression<Func<T>>[] propertyExpression)
我试图创建一个使用C#多表达parameteres
我只能说这是这样一个方法签名采取各种类型的多个属性:
AllPropertiesExcept(() => Property1,() => Property2)
这种方法几乎工作,但属性的类型必须相同。我只打算使用属性名称,但希望使用lambda表达式来实现轻松重构。
public static string MyMethod<T>(params Expression<Func<T>>[] propertyExpression)
我会用AllPropertiesExcept(params Expression<Func<object>>[] properties)
,你仍然可以得到属性名称出来,但它并不不管是什么类型的属性。
编辑:但是,我倾向于反过来使用它 - 而不是排除我不想看到的属性,我会包括我想看到的属性。原因很简单 - 以你的方式工作,你仍然需要思考 - 用我的方式,你可以很容易地使用你得到的实际数据直接。
编辑2(获取属性的名字在表达式):
Expression<Func<object>> obj = something; // you get this in your method
((obj.Body as UnaryExpression).Operand as MemberExpression).Member.Name
我真的建议你使用LinqPad这样的事情,你可以很容易地通过Dump()
深入对象,很显示的对象用户友好。只需重新创建一个小例子和实验即可。
方法AllPropertiesExcept()
是否返回任何东西?否则,你可以做一个流畅接口(使用方法链接):
var foo = AllPropertiesExcept(() => Property1)
.And(() => Property2)
.And(() => Property3)
.DoSomeThing();
:
AllPropertiesExcept(() => Property1)
.And(() => Property2)
.And(() => Property3);
即使AllPropertiesExcept()
方法返回的东西,你可以直到你在方法链的末端调用一个方法推迟执行
我想你需要的是了解ModelMetadata类记录在这里: http://msdn.microsoft.com/en-us/library/system.web.mvc.modelmetadata.aspx
该类在ASP.NET MVC应用在类似的情况下Html.LabelFor(X - > x.Name) 表达式传递给这里记录的ModelMetadata.FromLambdaExpression方法: http://msdn.microsoft.com/en-us/library/ee428393.aspx
理解它是如何在MVC使用后,你可以用它如何适用于其他地方也有知情的知识创建自己的代码。
我不明白你问题中的最后一段代码。这是你已经尝试过并且不起作用的吗?它只是伪代码吗? – Gabe 2011-02-22 18:23:50
我不明白在这里使用lambdas的目的。你不能只使用params object []来接受任何值吗?如果你只想要名字,你只能接受字符串。 – recursive 2011-02-22 18:42:22