2011-02-22 17 views
3

我试图创建一个使用C#多表达parameteres

我只能说这是这样一个方法签名采取各种类型的多个属性:

AllPropertiesExcept(() => Property1,() => Property2) 

这种方法几乎工作,但属性的类型必须相同。我只打算使用属性名称,但希望使用lambda表达式来实现轻松重构。

public static string MyMethod<T>(params Expression<Func<T>>[] propertyExpression) 
+0

我不明白你问题中的最后一段代码。这是你已经尝试过并且不起作用的吗?它只是伪代码吗? – Gabe 2011-02-22 18:23:50

+0

我不明白在这里使用lambdas的目的。你不能只使用params object []来接受任何值吗?如果你只想要名字,你只能接受字符串。 – recursive 2011-02-22 18:42:22

回答

3

我会用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()深入对象,很显示的对象用户友好。只需重新创建一个小例子和实验即可。

2

方法AllPropertiesExcept()是否返回任何东西?否则,你可以做一个流畅接口(使用方法链接):

var foo = AllPropertiesExcept(() => Property1) 
    .And(() => Property2) 
    .And(() => Property3) 
    .DoSomeThing(); 

AllPropertiesExcept(() => Property1) 
    .And(() => Property2) 
    .And(() => Property3); 

即使AllPropertiesExcept()方法返回的东西,你可以直到你在方法链的末端调用一个方法推迟执行

0

我想你需要的是了解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使用后,你可以用它如何适用于其他地方也有知情的知识创建自己的代码。