有没有一种简单而优雅的方法来获得带有C#泛型类型的字典的类型名称?

目前,我有以下代码工作:

if (property.PropertyType.Name == "Dictionary`2")
{
    Type[] arguments = property.PropertyType.GetGenericArguments();
    Type keyType = arguments[0];
    Type valueType = arguments[1];
    properties[property.Name] = $"Dictionary<{keyType.Name},{valueType.Name}>";
}

我想知道有没有更简单的方法来实现我想要的格式化字符串,比如:"Dictionary<type, type>"

推荐答案

我建议使用recursion,即

private static string MyTypeName(Type type) {
  if (type.IsArray)
    return $"{MyTypeName(type.GetElementType())}[]";

  if (type.IsGenericTypeDefinition)
    return type.Name[0..type.Name.IndexOf('`')];
  if (type.IsGenericType) 
    return $"{MyTypeName(type.GetGenericTypeDefinition())}<{string.Join(", ", type.GenericTypeArguments.Select(t => MyTypeName(t)))}>";

  return type.Name;
}

演示:

// Let's have an elaborated type to test the routine
var type = typeof(Dictionary<int, HashSet<string>[]>[][]);

Console.Write(MyTypeName(type));

输出:

Dictionary<Int32, HashSet<String>[]>[][]

Fiddle

Csharp相关问答推荐

子组件:如何根据另一个组件的状态启用输入

C#自定义字典与JSON(de—)serialize

有没有办法把+02:00转换成TimeSpan?""

Elasticsearch:当我try 使用c#将嵌套对象添加到filter中时出现问题

迭代C#List并在数据库中 for each 元素执行SELECT语句—更有效的方式?

==和Tuple对象的相等<>

将XPS转换为PDF C#

dotnet集合中内部数组的局部变量副本的用途是什么?'

在FilePath中搜索一个词,并根据First Match从左到右提取文件路径

具有单一导航属性的EF核心一对多关系

自动映射程序在GroupBy之后使用项目

C#EF Core WHERE IN LINQ FROM LIST WITH.CONTAINS不返回任何内容

为什么在使用动态obj+类obj时会调用串联?

Cosmos SDK和Newtonsoft对静态只读记录的可能Mutations

N层解决方案上的依赖注入-删除样板

该函数不能检测两条曲线的交点

如何在.NET AOT中为所有枚举启用JsonStringEnumConverter

如何在C#中正确类型化带有泛型的嵌套类

仅在Blazor Web App中覆盖生产的基本路径(.NET8中的_Hosts.cshtml文件功能?)

当我在Git中暂存文件更改时,它们会消失