假设我有一个类,其构造函数从文件读取的数据中获取其值,是否也可以使用字符串中的名称创建该类的实例。这样我就可以为每个打开的文件创建一个类的实例,并且可以自动加载构造函数。
//User chooses file to open
//Read ChocolateCake.txt values
string className = Path.GetFileName(path);
//code to remove .txt
//Instance name is taken from className
Cake "ChocolateCake" = new Cake(ingredient1, ingredient2, etc);
如何使用我读过的文件的名称创建Cake实例?
答案 0 :(得分:4)
你可以使用字典
var cakes = new Dictionary<string,Cake>();
cakes.Add(className, new Cake(ingredient1, ingredient2));
答案 1 :(得分:4)
不,你不能这样做。然而,您可以使用generic Dictionary<string, Cake>
并将蛋糕存放在那里......
var cakes = new Dictionary<string, Cake>();
此cakes
变量将包含多个Cake
类型的对象,每个对象都以唯一的string
值键入。
添加蛋糕就像......一样简单。
cakes.Add("ChocolateCake", new Cake(incredient1, incredient2, etc));
然后您可以按键值访问您的蛋糕(例如您的示例中的类名),因此:
cakes["ChocolateCake"];
答案 2 :(得分:1)
有时当我看到这样的问题需要某种对象负责创建一个合适的类型(例如你的实例中的Cake)时,基于输入(在你的情况下是字符串),是的,一个字典是一个很好的起点,但是我一直觉得这是一个指示更灵活的方法,例如使用Factory模式。
工厂建造物品。他们通常使用一些参数来帮助确定要构建的具体对象类型。工厂的返回类型通常是某种抽象,即接口或抽象类,工厂构建抽象的具体实现。
这意味着您可以拥有许多不同类型的Cake对象,并且工厂将根据输入字符串中定义的内容返回正确的对象。其中一个重要的好处是调用者不需要预先了解预期的具体类型,它将使用接口类型进行操作,这意味着当添加新的“Cake”类型时,您不需要继续更新调用者的代码
值得一读的是抽象类工厂,this是一个很好的小介绍。