Activator.CreateInstance上的字典中没有给定的密钥

时间:2012-06-22 08:31:17

标签: c#

我希望你能帮我解决这个问题。这已经困扰了我很久了。我在网上找不到确凿的答案。我有一个简单的类层次结构:BaseClass,ClassA,ClassB和DefaultClass派生自它。它们都有类似ClassA(输入输入)的构造函数:base(输入)......都非常简单。现在我有以下工厂

namespace mynamespace
{
    public class Factory
    {

        public static Dictionary<string, Type> Map = 
        new Dictionary<string, Type>
        {
            {"ClassA", typeof(ClassA)},
            {"ClassB", typeof(ClassB)}
        };
        public static BaseClass Create(Input input)
        {
            Type constructor;
            try
            {
                constructor = Map[input.ClassType];
            }
            catch (KeyNotFoundException)
            {
                constructor = typeof(DefaultClass);
            }
            return (BaseClass) Activator.CreateInstance(constructor, input);
        }
    }
}

如您所见,输入对象的.ClassType成员确定实例化的类。这种类型的构造已经用于简单的调用,如

var myClass = Factory.Create(input);

在我的独立应用程序中。现在我必须让应用程序在服务器上运行,并且对Create方法的调用从客户端接收序列化的输入对象。我会说这是有效的应用程序和没有的应用程序之间的唯一区别。现在,输入就是

[DataContract]
public class Input
{
    [DataMember] public string ClassType;
    [DataMember] public string member1;
}

之前没有这样的DataContract或DataMember注释。好了,现在代码在Activator.CreateInstance行崩溃了,但是“给定的密钥不存在于字典中”。你有什么想法可以解决这个问题吗?唯一的区别是构造函数中的序列化对象。

非常感谢提前和问候。

1 个答案:

答案 0 :(得分:5)

您提供的代码段应该可以正常工作。查看对象的构造函数。我确信异常会在其实现中的某处提出。

我完全同意更好地使用Dictionary.TryGetValue()而不是捕获异常。以下是学习例外的有用链接:Exception Handling