gpt4 book ai didi

c# - 在编译时知道返回类型的情况下动态创建方法

转载 作者:行者123 更新时间:2023-11-30 22:57:52 24 4
gpt4 key购买 nike

给定以下类(class):

public class Stock {
public string Name;
public double Price;
}

我有以下 DataFactory:

public class DataFactory {
public Stock Stock = new Stock();

public DataFactory Name(string name) {
Stock.name = name;
return this;
}

public DataFactory Price(double price) {
Stock.Price = price;
return this;
}
}

可以如下代码:

.....
new DataFactory().Name("ATVI").Price(50)
....

写成:

....
new DataFactory().ATVI().Price(50)
....

没有在工厂中实现 ATVI()?如果我事先动态创建方法,这将起作用。但这是否也可能在不知道调用什么方法的情况下进行?所以我正在寻找一些可以在生命周期内通知我未知属性/方法的钩子(Hook)。

如果这可行,是否可以在编译时使用智能感知调用 Price()?

如果存在重复线程,我不知道如何调用它,所以很抱歉。

最好的问候约瑟夫

最佳答案

假设您有一组有限的不经常更改的预定义文本文字,您可以使用 T4 生成枚举(甚至一类字符串常量)例如模板,并像这样使用它: DataFactory.Name(Tickers.ATVI).Price(50)
这将是一种最符合问题语义以及 C# 语言和工具能力的方法。

顺便说一下,您计划使用的方法链是构建器模式流畅界面 的组合,see an example in c#

如果您仍想将此隐藏为方法调用,您有两种选择:

  1. 使用 T4 预先生成方法列表部分类中的模板或作为数据工厂的扩展方法。您可以从 T4 中的数据存储中选择文字列表模板。这是一种相当普遍的方法。由于您将拥有预先生成的方法,itellisence 将使用这种方法。 read more about T4
  2. 使用DLRdynamic .这会将方法查找推迟到运行时,您可以创建一个自定义动态对象来接受任何方法调用,然后获取该方法名称并将其作为参数传递给您的 Name。方法。 Intellisence 不适用于此方法,因为您在程序集中没有关于您的方法的任何元数据。 How to create a dynamic object
  3. 使用dynamic并另外创建一个智能扩展,请参阅 Custom Intellisense Extension了解更多详情

你可以更进一步,写一个 Roslyn分析器,并将其安装在您的 Visual Studio 中以从 DataFactory().Name("ATVI") 获得自动代码修复至 DataFactory().ATVI() ,也就是说 - 如果您有时间/资源。查看example of code analyzer

一如既往,答案是“视情况而定”,上下文就是一切,因此很难说哪种解决方案最适合您。我宁愿选择最简单的 1),尤其要记住 2) 和 3) 的复杂性和维护成本

如果您需要任何选项的更多详细信息,请告诉我希望对您有所帮助!

关于c# - 在编译时知道返回类型的情况下动态创建方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53349880/

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