gpt4 book ai didi

c# - 使用表达式将属性作为引用传递

转载 作者:太空宇宙 更新时间:2023-11-03 11:38:19 27 4
gpt4 key购买 nike

This发布将属性作为引用传递的详细解决方法,包括使用

等表达式
  public void StoreProperty(Expression<Func<T, object>> expr)

这种方法没问题,我注意到许多框架似乎都在使用这种方法(例如 automapper、autofac),详见 James Gregory 的 Introduction to static reflection他说

The great thing about this is that if you change the name of a member inside a lambda, you’ll get a compile error if you haven’t updated all the references! No more hidden bugs.

虽然我更喜欢这种方法,但它仍然不完美,因为您可以传递任何返回对象的表达式(或任何返回值),例如

 x => x.Name) //fine
x => x.Name+"x") //runtime error

目前是否有更好的方法来引用该属性(通过锁定表达式或其他方式)

如果否, future 版本的 C# 将如何锁定表达式?例如,像这样的东西:

public void StoreProperty(Expression<Func<T, object>> expr) where expr.Member is PropertyInfo

说明:以上只是一个例子,我知道目前不支持;这就是我要讨论的内容。

最佳答案

嗯,我不明白这怎么可能。

我不会说这个建议“离谱”,它根本不是预期用途。事实上,整个概念虽然在这种情况下非常有用,但并不是为了回答这种情况而设计的。 LINQ 旨在作为一种具有丰富表达式机制的可扩展查询语言。Linq 扩展了语言语法以允许在提供的类型上使用强类型安全表达式,这就是您可以以这种方式使用它来获得强类型安全表达式的原因。

在这种情况下,您正在创建一个函数,将一种数据类型(T 对象)转换为另一种数据类型 - 通用对象。如果我被禁止写像 p=>p.Name+"something" 这样的东西,我就会失去很多语言固有的灵 active 。IE。这是不可能的 p=>p.X + p.Y 作为一些返回元素总和的查询结果。

您展示的解决方案旨在利用 linq 的一项功能 - 强大的、类型安全的属性名称。它提供了一种使用 linq 解决问题的优雅方式,但与任何解决方案一样 - 它可能会被滥用。

通过 p=>p.Name+"something" 的开发人员没有理解解决方案的预期用途,这是需要培训的问题。

关于c# - 使用表达式将属性作为引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5529836/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com