gpt4 book ai didi

c# - 获取实现接口(interface)的 "default"具体类

转载 作者:行者123 更新时间:2023-11-30 17:09:09 25 4
gpt4 key购买 nike

我正在实现自定义(和通用)Json.net 序列化程序,但在我需要一些帮助的道路上遇到了障碍。

当反序列化器映射到作为接口(interface)的属性时,我如何才能最好地确定要构造什么样的对象来反序列化以放入接口(interface)属性。

我有以下内容:

[JsonConverter(typeof(MyCustomSerializer<foo>))]
class foo
{
int Int1 { get; set; }
IList<string> StringList {get; set; }
}

我的序列化器正确地序列化了这个对象,但是当它返回时,我尝试将 json 部分映射到对象,我有一个 JArray 和一个接口(interface)。

我目前正在实例化任何可枚举的东西,比如 List as

 theList = Activator.CreateInstance(property.PropertyType);

这可以在反序列化过程中创建,但当属性为 IList 时,我会收到关于无法实例化接口(interface)的运行时投诉(很明显)。

那么在这种情况下我怎么知道要创建什么类型的具体类呢?

谢谢

最佳答案

您可以创建一个字典,将接口(interface)映射到您认为应该是默认类型的任何类型(“接口(interface)的默认类型”不是语言中定义的概念):

var defaultTypeFor = new Dictionary<Type, Type>();
defaultTypeFor[typeof(IList<>)] = typeof(List<>);
...
var type = property.PropertyType;
if (type.IsInterface) {
// TODO: Throw an exception if the type doesn't exist in the dictionary
if (type.IsGenericType) {
type = defaultTypeFor[property.PropertyType.GetGenericTypeDefinition()];
type = type.MakeGenericType(property.PropertyType.GetGenericArguments());
}
else {
type = defaultTypeFor[property.PropertyType];
}
}
theList = Activator.CreateInstance(type);

(我还没有尝试过这段代码;如果您遇到问题请告诉我。)

关于c# - 获取实现接口(interface)的 "default"具体类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13211012/

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