我从xml文件中读取了一些属性,其中包含一个引用llblgen对象的字符串,例如'article'。现在我已经建立了一个相当长的
Select Case myString
Case "article"
return New ArticleEntity()
等。随着时间越来越长,这变得相当丑陋;)。有更好的方法吗?
(以上是vb.net,但c#示例也很好)
答案 0 :(得分:3)
你可以创建一个字典,将字符串映射到工厂方法,例如
Dictionary<string, Func<Animal>> _map = new Dictionary
{
("cat", () => new Cat()),
("dog", () => new Dog())
...
}
然后您的案例陈述变为
return _map[myString]();
答案 1 :(得分:2)
您可以将类型名称存储在文件中并使用:
return Activator.CreateInstance(Type.GetType("Some.Type.String"));
(只要Some.Type.String
有一个默认的无参数构造函数,就可以工作。)
答案 2 :(得分:1)
字符串是否恰好代表对象类型的名称。如果是这样,你可能会这样做。
Object obj = Activator.CreateInstance("AssemblyName", "TypeName");
所以,如果您从列表中返回类型,则可以执行...
List<object> list = new List<object>();
foreach(string typename in GetFromXMLFile())
{
list.Add(Activator.CreateInstance("AssemblyName", typename);
}
答案 3 :(得分:0)
请注意Activator.CreateInstance
有一个通用版本,它不需要强制转换为基类(如果有这样的基类或接口):
public static IMyTrait MakeMyTrait(Type t) {
return Activator.CreateInstance<IMyTrait>(t);
}
答案 4 :(得分:0)
啊非常好。不确定对象是否与文件中的完全相同,但我宁愿编辑该文件,也不要继续使用那个丑陋的选择案例。
感谢您的建议!