我希望你能帮我解决这个问题。这已经困扰了我很久了。我在网上找不到确凿的答案。我有一个简单的类层次结构: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行崩溃了,但是“给定的密钥不存在于字典中”。你有什么想法可以解决这个问题吗?唯一的区别是构造函数中的序列化对象。
非常感谢提前和问候。
答案 0 :(得分:5)
您提供的代码段应该可以正常工作。查看对象的构造函数。我确信异常会在其实现中的某处提出。
我完全同意更好地使用Dictionary.TryGetValue()而不是捕获异常。以下是学习例外的有用链接:Exception Handling。