我希望声明一个基于运行时类型的字典.因此,与其这样做,不如:

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调用中以字符串形式获取类型.然后,我使用反射通过Assembly QualifiedName获取类型,这将产生一个执行调用的列表.根据这些类型的名称,需要调用REST端点.

If (type == SomeType) httpClient.GetAsync("SomePath/{SomeType.Name}")

此终结点返回字典&lt;SomeType,字符串&gt;.为了能够反序列化这些类型,我需要调用类似

httpClient.GetAsync<Dictionary<type, string>>("SomePath/{SomeType.Name}")

否则,System.Text.Json包中将出现异常.

推荐答案

如果你真的不关心编译时的类型,你只想创建一个实例,你可以很容易地用反射来做到这一点:

var dictionaryType = typeof(Dictionary<,>).MakeGenericType(type, typeof(string));
var dictionary = Activator.CreateInstance(dictionaryType);

上面的dictionaryType构造还允许您呼叫:

var result = SomeMethod(dictionaryType);

Csharp相关问答推荐

将C#字符串转换为其UTF8编码字符的十六进制表示

如何禁用ASP.NET MVP按钮,以便无法使用开发人员控制台重新启用它

C#类主构造函数中的调试参数

如何告诉自己创建的NuGet包在应用程序中发生了变化?

使用LINQ to XML获取元素值列表是不起作用的

为什么C#Bigbit不总是相同的比特长度?

如何在Visual Studio代码中更改大括号模式{},用于C#语言

从应用程序图API调用访问所有者字段

模型绑定RazorPage表单

C#XmlSerializer-输出控制新行的多个XML片段

如何忽略API JSON响应中的空字符串?

实体框架核心中的ComplexType和OwnsOne有什么不同?

UWP中的任务和界面

如何使用自定义负载均衡器管理Ocelot负载均衡器中的多线程和批读取

具有可空类型的C#NOTNULL约束具有意外行为

EFR32BG22 BLE在SPP模式下与PC(Windows 10)不连接

如何将FindAll()与Nuget包Interop.UIAutomationClient一起使用

如何使用用于VS代码的.NET Maui扩展在我的iOS/Android设备或模拟器上进行调试?

链接到字典字符串.拆分为(.Key,.Value)

在C#和HttpClient中使用REST API