在编译时知道返回类型的地方动态创建方法

时间:2018-11-17 09:26:42

标签: c# visual-studio-2017

有以下课程:

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()? 如果我事先动态创建方法,这将起作用。但这是否可能在不知道调用哪种方法的情况下?因此,我正在寻找一生中可能会引起未知属性/方法的钩子。

如果这行得通,可以在编译时使用智能感知来调用Price()吗?

不知道如何调用它,如果存在重复的线程,抱歉。

最好的问候 约瑟夫(Josef)

2 个答案:

答案 0 :(得分:2)

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

顺便说一句,您计划使用的方法链是构建器模式流畅接口see an example in c#

的组合

如果您仍然希望将其隐藏为方法调用,则有两种选择:

  1. Pre-使用部分类中的T4模板或作为数据工厂的扩展方法生成方法列表。您可以从T4模板中的数据存储中选择一个文字列表。这是一个相当普遍的方法。由于您将预先生成方法,因此智能化将适用于此方法。 read more about T4
  2. 使用DLRdynamic。这会将方法查找推迟到运行时,您可以创建一个自定义动态对象,该对象将接受任何方法调用,然后采用该方法名称并将其作为参数传递给您的Name方法。由于程序集中没有关于方法的任何元数据,因此智能不适用于此方法。 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)的复杂性和维护成本

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

答案 1 :(得分:0)

以下代码

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

不能写为

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

实际上,这些代码都不起作用。因为您无法从函数“名称”中获得函数“价格”,而“ ATVI()”不是有效函数

我对您要完成的工作并不烦恼,给定的代码将返回一个函数。 但是如果我没记错的话,您想通过“名称”设置“价格”。 那么我认为您需要的是Dictionary

我试图提出一个不错的功能或类似的功能,但是我真的不知道你要干什么...