提问人:Zenith 提问时间:11/8/2023 最后编辑:Zenith 更新时间:11/8/2023 访问量:158
基于运行时值获取泛型类型的字典
Get a dictionary of a generic type based on a runtime value
问:
我希望声明一个基于运行时类型的字典。所以,与其这样做:
IEnumerable dict = null;
if(type == typeof(SomeType)) dict = new Dictionary<SomeType, string>()
if(type == typeof(SomeOtherType)) dict = new Dictionary<SomeOtherType, string>()
我想做这样的事情:
IEnumerable dict = new Dictionary<type, string>();
我怎样才能做到这一点?此外,我希望能够通过以下方式之一仅使用字典类型调用不同的方法:
var result = SomeMethod(typeof(Dictionary<type, string>));
var result = SomeMethod<Dictionary<type, string>>();
编辑: 额外上下文:
我从不同的 API 调用中获取类型作为字符串。然后,我使用反射通过 AssemblyQualifiedName 获取类型,从而生成一个用于执行调用的 List。根据这些类型的名称,需要调用 REST 端点。
If (type == SomeType) httpClient.GetAsync("SomePath/{SomeType.Name}")
此终结点返回 Dictionary<SomeType, string>。为了能够反序列化这些类型,我需要调用类似的东西
httpClient.GetAsync<Dictionary<type, string>>("SomePath/{SomeType.Name}")
否则,System.Text.Json 包中将发生异常。
答:
6赞
Jon Skeet
11/8/2023
#1
如果你真的不关心编译时的类型,你只想创建一个实例,你可以用反射轻松做到这一点:
var dictionaryType = typeof(Dictionary<,>).MakeGenericType(type, typeof(string));
var dictionary = Activator.CreateInstance(dictionaryType);
上面的构造还可以让你调用:dictionaryType
var result = SomeMethod(dictionaryType);
评论
0赞
Zenith
11/8/2023
这似乎正是我想要的。谢谢!我仍然在反序列化方面存在一些问题,但至少正确使用了该类型。关于将 json 反序列化为运行时类型字典的任何提示?
2赞
Jon Skeet
11/8/2023
@StijnWingens:不,请提出一个包含所有相关背景的新问题。(我甚至不知道你的意思,即使很清楚,在评论中提出后续问题也是不合适的。
评论
Dictionary<object, string>
Dictionary<InterfaceThatAllRelevantTypesImplement, string>