我希望你能帮我解决这个问题。它已经困扰了我很长一段时间了。而且我在网上找不到确凿的答案。我有一个简单的类层次结构:从它派生的带有 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 行崩溃,出现异常“给定的键不在字典中”。你知道为什么会这样吗?唯一的区别是构造函数中的序列化对象。
非常感谢提前和问候。