c# - 使用字典创建对象的新实例

标签 c# dictionary

我想知道是否可以使用 Dictionary<string, MyType>作为一个对象工厂,换句话说,给定一个字符串“Foo”我想检索我的 Foo 的新实例类。

private Dictionary<string, MyType> ClassDic = new Dictionary<string, MyType>()
{
     {"Foo", new Foo()},
     {"Bar", new Bar()},
     //many more

}

我基本上想做的是替换大量 if 语句,然后手动创建对象:

 if(line == "Foo") { Stuff.Add(new Foo() { ID = i }; }
 if(line == "Bar") { Stuff.Add(new Bar() { ID = i }; }

(FooBar 都派生自同一个基类)

像这样:

BaseClass myObject;
if(ClassDic.TryGetValue(line, out myObject))
{
     Stuff.Add(myObject);
     myObject.ID = i;
}

问题是在我的代码中,字典为我提供了相同的对象引用,因此属性会被覆盖(例如,如果我有 300 个对象,最后所有 300 个对象将具有相同的 ID(最后一个))。

我也对解决这个问题的其他方法持开放态度。

最佳答案

I wonder if it is possible to use Dictionary as a object factory, in other words, given a string "Foo" I want to retrieve a new instance of my Foo class.

如果您想创建一个 实例,我建议您使用 Dictionary<string, Func<MyType>>像这样:

private static readonly Dictionary<string, Func<MyType>> Factories =
    new Dictionary<string, Func<MyType>>()
{
     {"Foo", () => new Foo() },
     {"Bar", () => new Bar() },
}

然后你可以使用:

MyType x = Factories[name]();

话虽如此,如果键真的只是类的名称,您可以使用反射:

Type type = Type.GetType(name);
MyType x = (MyType) Activator.CreateInstance(type);

请注意 name这里必须是命名空间限定的类名,因此您可能需要将命名空间添加到您传递的名称之前。它还将只查找当前正在执行的程序集中的类型和 mscorlib ;如果您需要来自其他程序集的类型,您可以传入程序集限定名称,或调用 Assembly.GetType(name)而不是在相关程序集上。

关于c# - 使用字典创建对象的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29642561/

相关文章:

c# - C#.Net Close应用程序超出内存使用量

c# - 将多个复杂对象传递给 post/put Web API 方法

c# - 将 IEnumerables 的 IEnumerable 转换为字典

python - 顺序处理比池处理更快

python - 快速从给定列表中查找字典中的所有键

python - python中字典将字符串替换为数字

c# - 在当前页面找到一个控件

c# - 仅在调试时出现 ExecutionEngineException

javascript - 从JS发送参数到asp.net

python - 访问元组字典中所有元素的相同值