gpt4 book ai didi

c# - 给定的键不存在于 Activator.CreateInstance 的字典中

转载 作者:太空狗 更新时间:2023-10-30 01:07:54 26 4
gpt4 key购买 nike

我希望你能帮我解决这个问题。它已经困扰我很长一段时间了。而且我在网上找不到确凿的答案。我有一个简单的类层次结构:BaseClass 以及派生自它的 ClassA、ClassB 和 DefaultClass。它们都有一个构造函数,例如 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;
}

wheras 之前它没有这样的 DataContract 或 DataMember 注释。那么,现在代码在 Activator.CreateInstance 行崩溃,出现异常“字典中不存在给定的键”。你知道为什么会这样吗?唯一的区别是构造函数中的序列化对象。

非常感谢和问候。

最佳答案

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

我完全同意最好使用 Dictionary.TryGetValue() 而不是捕获异常。这是学习异常的有用链接:Exception Handling .

关于c# - 给定的键不存在于 Activator.CreateInstance 的字典中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11152732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com