4

我希望你能帮我解决这个问题。它已经困扰了我很长一段时间了。而且我在网上找不到确凿的答案。我有一个简单的类层次结构:从它派生的带有 ClassA、ClassB 和 DefaultClass 的 BaseClass。它们都有一个像 ClassA(Input input) : base(input) ... 之类的构造函数,都非常简单。现在我有以下工厂

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 行崩溃,出现异常“给定的键不在字典中”。你知道为什么会这样吗?唯一的区别是构造函数中的序列化对象。

非常感谢提前和问候。

4

1 回答 1

5

您提供的代码片段应该可以正常工作。查看对象的构造函数。我确信在他们的实现中的某个地方引发了异常。

And I fully agree that better to use Dictionary.TryGetValue() instead of catching exception. Here is useful link to learn exceptions: Exception Handling.

于 2012-06-22T08:57:11.577 回答