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

edd*_*edd 4 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,输入对象的.ClassType成员确定实例化了哪个类.这种类型的构造一直在为一个简单的调用工作

var myClass = Factory.Create(input);
Run Code Online (Sandbox Code Playgroud)

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

[DataContract]
public class Input
{
    [DataMember] public string ClassType;
    [DataMember] public string member1;
}
Run Code Online (Sandbox Code Playgroud)

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

非常感谢提前和问候.

Ser*_* B. 5

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

我完全同意更好地使用Dictionary.TryGetValue()而不是捕获异常.这是学习异常的有用链接:异常处理.

  • 大.因此,请将我的答案标记为已接受. (2认同)