【问题标题】:Name instance from string in C#从 C# 中的字符串命名实例
【发布时间】:2015-04-14 16:13:16
【问题描述】:

假设我有一个类的构造函数从文件读取的数据中获取其值,是否也可以使用字符串中的名称创建该类的实例。这样我可以为我打开的每个文件创建一个类的实例,并且可以自动加载构造函数。

//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 实例?

【问题讨论】:

  • 变量名根本不应该有什么不同,你想做什么?这听起来像XY problem
  • 他确实问了一个问题,但没有问号!
  • 为什么创建变量className却使用字符串文字"ChocolateCake"?但即使你解决了这个问题,为什么变量名很重要(Sayse's comment)?听起来好像您想按名称存储这些蛋糕。然后使用Dictionary<string, Cake>,正如理查德建议的in his answer

标签: c# .net


【解决方案1】:

不,你不能这样做。但是,您可以使用 generic Dictionary<string, Cake> 并将您的蛋糕存放在其中...

var cakes = new Dictionary<string, Cake>();

这个cakes 变量将包含多个Cake 类型的对象,每个对象都由一个唯一的string 值作为键。

添加蛋糕就像...一样简单

cakes.Add("ChocolateCake", new Cake(incredient1, incredient2, etc));

然后您可以通过键值(例如您的示例中的类名)访问您的蛋糕,因此:

cakes["ChocolateCake"];

【讨论】:

  • 所以我创建了一个 Cake 类型的列表并按照您显示的方式添加到其中?
  • @Mike159 没有列表,只有字典。
  • 我建议您使用Dictionary 对象,因为这将允许您使用字符串值存储每个蛋糕,以便随后获取蛋糕。
【解决方案2】:

你可以用字典,

var cakes = new Dictionary<string,Cake>();
cakes.Add(className, new Cake(ingredient1, ingredient2));

【讨论】:

    【解决方案3】:

    有时当我看到这样的问题需要某种对象负责根据输入(在您的情况下为字符串)创建适当的类型(例如,您的实例中的 Cake)时,是的,字典是一个很好的起点,但是我一直觉得这是一个指标,可以研究更灵活的方法,例如使用Factory 模式。

    工厂构建对象。他们通常使用一些参数来执行此操作,这些参数有助于确定要构建哪种类型的具体对象。工厂的返回类型通常是某种抽象,即接口或抽象类,工厂构建抽象的具体实现。

    这意味着您可以拥有许多不同类型的 Cake 对象,并且工厂会根据您输入字符串中定义的内容返回正确的对象。一个重要的好处是调用者不需要预先知道预期的具体类型,它将使用接口类型而不是意味着你不需要在添加新的“蛋糕”类型时不断更新调用者的代码.

    关于抽象类工厂值得一读,this 是一个不错的小介绍。

    【讨论】:

    • 有趣的文章。我怀疑从一开始就正确设计我的程序会有很大帮助。
    • 这是另一个有用的链接,它进一步解释了这些模式:stackoverflow.com/questions/5739611/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 2010-10-25
    相关资源
    最近更新 更多