时间:2019-03-07 标签:c#multipleexpressionparameter

发布于 2024-10-18 09:26:23 字数 330 浏览 1 评论 0 原文

我正在尝试创建一个方法签名,该方法签名采用不同类型的多个属性,

我将其称为如下:

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

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

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

I'm trying to create a method signature that takes multiple properties of various type using

I would call it something like this:

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

This method almost work, except that the type of the properties have to be the same. I'm only going to use the property name, but want to use lambda expression to enable easy refactoring.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

海螺姑娘 2024-10-25 09:26:23

我会使用 AllPropertiesExcept(params Expression>[] 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() 轻松向下钻取对象,这会非常用户友好地显示对象。只需重新创建一个小示例并进行实验即可。

I would use AllPropertiesExcept(params Expression<Func<object>>[] properties), you can still get the property names out of it, but it doesn't matter what type the property is.

Edit: However, I would tend to use it the other way round - instead of excluding properties I don't want to see, I would include properties I want to see. The reason is simple - to make your way work, you still need reflection - with my way, you could easily use the Func you get to get the actual data directly.

Edit 2 (getting the property name out of an expression):

Expression<Func<object>> obj = something; // you get this in your method

((obj.Body as UnaryExpression).Operand as MemberExpression).Member.Name

I can really advise you to use LinqPad for such things, you can easily drill down objects via Dump(), which displays the objects very user friendly. Just recreate a small example and experiment.

三生一梦 2024-10-25 09:26:23

AllPropertiesExcept() 方法是否返回任何内容?否则,您可以创建一个流畅的接口(使用方法链):

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

即使 AllPropertiesExcept() 方法返回某些内容,您也可以推迟执行,直到调用方法链末尾的方法:

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

Does the method AllPropertiesExcept() return anything? Otherwise you could make a fluent interface (using method chaining):

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

Even if the AllPropertiesExcept() method returns something, you can defer the execution until you invoke a method at the end of the method chain:

var foo = AllPropertiesExcept(() => Property1)
    .And(() => Property2)
    .And(() => Property3)
    .DoSomeThing();
红ご颜醉 2024-10-25 09:26:23

我认为您需要的是理解此处记录的 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 中的使用方式后,您可以通过了解它在其他地方的应用方式来创建自己的代码。

I think what you need is to understand the ModelMetadata class documented here:
http://msdn.microsoft.com/en-us/library/system.web.mvc.modelmetadata.aspx

This class is used in ASP.NET MVC in situations like Html.LabelFor(x -> x.Name)
An expression is passed to the ModelMetadata.FromLambdaExpression Method documented here:
http://msdn.microsoft.com/en-us/library/ee428393.aspx

After understanding how it is used in MVC, you could create your own code with some informed knowledge of how it was applied elsewhere.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文