有以下课程:
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)
答案 0 :(得分:2)
假设您有一组不经常更改的预定义文本文字,,您可以使用T4
模板生成一个枚举(甚至一类字符串常量)例如,并像这样使用它:
DataFactory.Name(Tickers.ATVI).Price(50)
那将是一种与问题的语义以及C#语言和工具功能最匹配的方法。
顺便说一句,您计划使用的方法链是构建器模式和流畅接口,see an example in c#
的组合如果您仍然希望将其隐藏为方法调用,则有两种选择:
T4
模板或作为数据工厂的扩展方法生成方法列表。您可以从T4
模板中的数据存储中选择一个文字列表。这是一个相当普遍的方法。由于您将预先生成方法,因此智能化将适用于此方法。 read more about T4 DLR
和dynamic
。这会将方法查找推迟到运行时,您可以创建一个自定义动态对象,该对象将接受任何方法调用,然后采用该方法名称并将其作为参数传递给您的Name
方法。由于程序集中没有关于方法的任何元数据,因此智能不适用于此方法。 How to create a dynamic object 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
类我试图提出一个不错的功能或类似的功能,但是我真的不知道你要干什么...