c#多个表达式参数

时间:2011-02-22 18:04:00

标签: c# linq lambda

我正在尝试创建一个方法签名,使用

获取各种类型的多个属性

我会这样称呼:

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

除了属性的类型必须相同之外,此方法几乎可以工作。我只会使用属性名称,但希望使用lambda表达式来实现轻松的重构。

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

3 个答案:

答案 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中使用它之后,您可以创建自己的代码,并了解它在其他地方的应用方式。