gpt4 book ai didi

c# - 关于 C# 表达式树的建议

转载 作者:行者123 更新时间:2023-11-30 14:21:07 25 4
gpt4 key购买 nike

我正在研究一种接受表达式树作为参数以及类的类型(或实例)的方法。

基本思想是此方法会将某些内容添加到将用于验证的集合中。

public interface ITestInterface
{
//Specify stuff here.
}

private static void DoSomething<T>(Expression<Func<T, object>> expression, params IMyInterface[] rule)
{
// Stuff is done here.
}

方法调用如下:

class TestClass
{
public int MyProperty { get; set; }
}

class OtherTestClass : ITestInterface
{
// Blah Blah Blah.
}

static void Main(string[] args)
{
DoSomething<TestClass>(t => t.MyProperty,
new OtherTestClass());
}

我这样做是因为我希望传入的属性名称是强类型的。

我正在努力解决的几件事..

  1. 在 DoSomething 中,我想获取 T 的 PropertyInfo 类型(来自传入的正文)并将其与 rule[] 一起添加到集合中。目前,我正在考虑使用 expression.Body 并从“Convert.([propertyname])”中删除 [propertyname] 并使用反射来获得我需要的东西。这看起来很麻烦而且是错误的。有没有更好的方法?
  2. 这是我正在使用的特定模式吗?
  3. 最后,感谢任何关于我对我所做工作的误解的建议或澄清,并且/或有关 C# 表达式树的资源或好的信息也非常感谢。

谢谢!

伊恩

编辑:

expression.Body.ToString() 在 DoSomething 方法中返回的示例是一个包含“Convert(t.MyProperty)”的字符串,如果从上面的示例中调用的话。

我确实需要它是强类型的,所以如果我更改属性名称,它不会编译。

感谢您的建议!

最佳答案

我严重依赖表达式树来将我想对当前应用程序执行的许多操作推送到编译时,即静态类型检查。

我遍历表达式树以将它们翻译成其他“有意义”的东西。

我最终做了很多事情是,我依赖于 MVC 之类的方法而不是 URL,在这种方法中我声明 lambda 函数,并将其翻译...解释,编译器将表达式树生成为 URL。调用此 URL 时,我执行相反的操作。这样,我就可以对断开的链接进行所谓的编译时检查,这对重构和重载也很有效。我认为以这种方式考虑使用表达式树很酷。

您可能想查看访问者模式,开始使用它很痛苦,因为它在开始时没有多大意义,但它将所有内容联系在一起,并且它是解决编译器构造中类型检查的一种非常正式的方法。您可以这样做,但不是类型检查而是发出您需要的任何东西。

我目前正在努力解决的问题是能够构建一个简单的框架来翻译(或者实际上我应该说是解释)表达式树并发出 JavaScript。这个想法是,编译器生成的表达式树将转换为与某些对象模型接口(interface)的有效 JavaScript。

令人兴奋的是编译器总是能够在我出错时告诉我并确定最终结果只是一堆字符串,但重要的部分是这些字符串是如何创建的。他们通过了一些验证,这意味着什么。

一旦你做到了这一点,就没有什么是你不能用表达式树做的了。

在使用 System.Reflection.Emit 时,我发现自己使用表达式树来创建一个用于动态编译的轻量级框架,它在编译时基本上可以说明我动态创建的程序集是否也可以编译,并且这很有效与反射和静态类型检查无缝衔接。它越走越远,最终得到了一些东西,最终节省了大量时间,并被证明是非常敏捷和健壮的。

所以我喜欢这种东西,这就是元编程的全部内容,在你的程序中编写程序来执行程序。我说让它来吧!

关于c# - 关于 C# 表达式树的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/155792/

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