将“C# 友好类型”名称转换为实际类型:“int” => typeof(int)

2024-06-21

我想得到一个System.Type给定一个string指定(原始)类型C# 友好名称,基本上与 C# 编译器读取 C# 源代码时的方式相同。

我觉得描述我所追求的最好方式是单元测试的形式。

我希望存在一种通用技术,可以使以下所有断言通过,而不是尝试对特殊 C# 名称的特殊情况进行硬编码。

Type GetFriendlyType(string typeName){ ...??... }

void Test(){
    // using fluent assertions

    GetFriendlyType( "bool" ).Should().Be( typeof(bool) );
    GetFriendlyType( "int" ).Should().Be( typeof(int) );

    // ok, technically not a primitive type... (rolls eyes)
    GetFriendlyType( "string" ).Should().Be( typeof(string) ); 

    // fine, I give up!
    // I want all C# type-aliases to work, not just for primitives
    GetFriendlyType( "void" ).Should().Be( typeof(void) );
    GetFriendlyType( "decimal" ).Should().Be( typeof(decimal) ); 

    //Bonus points: get type of fully-specified CLR types
    GetFriendlyName( "System.Activator" ).Should().Be(typeof(System.Activator));

    //Hi, Eric Lippert! 
    // Not Eric? https://stackoverflow.com/a/4369889/11545
    GetFriendlyName( "int[]" ).Should().Be( typeof(int[]) ); 
    GetFriendlyName( "int[,]" ).Should().Be( typeof(int[,]) ); 
    //beating a dead horse
    GetFriendlyName( "int[,][,][][,][][]" ).Should().Be( typeof(int[,][,][][,][][]) ); 
}

到目前为止我尝试过的:

这个问题是对我的一个较旧的问题 https://stackoverflow.com/q/4615553/11545询问如何从类型中获取“友好名称”。

这个问题的答案是:使用CSharpCodeProvider

using (var provider = new CSharpCodeProvider())
{
    var typeRef = new CodeTypeReference(typeof(int));
    string friendlyName = provider.GetTypeOutput(typeRef);
}

我无法弄清楚如何(或者如果可能的话)以相反的方式进行操作并从CodeTypeReference(它还有一个演员需要string)

var typeRef = new CodeTypeReference(typeof(int));

你不是已经解决了大部分问题了吗?

下面为您提供了所有内置 C# 类型http://msdn.microsoft.com/en-us/library/ya5y69ds.aspx http://msdn.microsoft.com/en-us/library/ya5y69ds.aspx, plus void.

using Microsoft.CSharp;
using System;
using System.CodeDom;
using System.Reflection;

namespace CSTypeNames
{
    class Program
    {
        static void Main(string[] args)
        {
            // Resolve reference to mscorlib.
            // int is an arbitrarily chosen type in mscorlib
            var mscorlib = Assembly.GetAssembly(typeof(int));

            using (var provider = new CSharpCodeProvider())
            {
                foreach (var type in mscorlib.DefinedTypes)
                {
                    if (string.Equals(type.Namespace, "System"))
                    {
                        var typeRef = new CodeTypeReference(type);
                        var csTypeName = provider.GetTypeOutput(typeRef);

                        // Ignore qualified types.
                        if (csTypeName.IndexOf('.') == -1)
                        {
                            Console.WriteLine(csTypeName + " : " + type.FullName);
                        }
                    }
                }
            }

            Console.ReadLine();
        }
    }
}

这是基于我认为在撰写本文时正确的几个假设:

  • 所有内置 C# 类型都是 mscorlib.dll 的一部分。
  • 所有内置 C# 类型都是在System命名空间。
  • Only调用返回的内置 C# 类型名称CSharpCodeProvider.GetTypeOutput没有一个“.”在他们中。

Output:

object : System.Object
string : System.String
bool : System.Boolean
byte : System.Byte
char : System.Char
decimal : System.Decimal
double : System.Double
short : System.Int16
int : System.Int32
long : System.Int64
sbyte : System.SByte
float : System.Single
ushort : System.UInt16
uint : System.UInt32
ulong : System.UInt64
void : System.Void

现在我只需要坐下来等待埃里克过来告诉我how我错了。我已经接受了我的命运。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将“C# 友好类型”名称转换为实际类型:“int” => typeof(int) 的相关文章

随机推荐

  • 在测试期间调用预定方法[重复]

    这个问题在这里已经有答案了 我正在使用 Maven 开发 SpringBoot 应用程序 我有一个班级 Component有方法的注释m与 Scheduled initialDelay 1000 fixedDelay 5000 注解 这里f
  • 从 Angular2 模块导出时遇到问题

    我是 Angular 2 的初学者 我试图了解如何从功能模块导出类 并将其导入到我的主模块中 当我尝试在打字稿中编译它时 我收到以下两个错误 app app component ts 11 21 错误 TS2304 找不到名称 添加服务 a
  • Laravel 使用 laravel-cors 和 axios 进行 POST 的“CSRF 令牌不匹配”

    我有一个正在运行的domain A拉拉维尔 5 8返回 API 的引擎网络路线 它必须检查来源才能只服务几个域 包括domain B Barryvdh laravel cors我安装了barryvdh laravel cors https
  • 在Python中从日期时间中减去秒

    我有一个 int 变量 它实际上是秒 让我们调用这个秒数X 我需要得到当前日期和时间 以日期时间格式 减去的结果X秒 Example If X是 65 当前日期是2014 06 03 15 45 00 那么我需要得到结果2014 06 03
  • 在数据库准备好之前运行 Jest 测试

    我正在使用 Jest 来测试我的带有 SQLite 数据库的 Express API 但是出现了以下问题 测试在数据库准备好并创建表之前运行 我使用以下代码连接到数据库 const connectToDatabase gt let db i
  • GitLab Runner 重启后不会自动拾取作业

    所以我们的 GitLab Runner 已经正常运行了几周了 我必须进行一些升级 需要在安装它的计算机上重新启动 重新启动后 它不再自动拾取作业 我所有的管道都说它们被卡住了 因为没有跑步者可以接替工作 我通过 SSH 连接到机器并运行 s
  • RecyclerView元素更新+异步网络调用

    我有一个按预期工作的回收视图 我的布局中有一个按钮可以填充列表 该按钮应该进行异步调用 根据结果 我更改按钮的外观 这一切都发生得很好 但是 当我单击按钮并快速向下滚动列表时 异步调用的结果会更新新视图的按钮 代替旧视图的视图 我该如何处理
  • iOS 上的推送通知渐进式 Web 应用程序

    我需要开发一个集成了推送通知的渐进式网络应用程序 在网上搜索我发现了关于这个主题的不同意见 如果我理解正确的话 目前我们无法在移动版 safari 中推送通知 但仅限桌面版 这样对吗 你有什么建议来获得相同的结果吗 我不是iOS专家 我想知
  • 在游戏中实现功能

    我在完成这部分作业时遇到了麻烦 我必须宣布游戏的获胜者 然后输入到函数中 输入所有 if 语句后 我必须创建一个函数def playGame 这必须包括 showRules user getUserChoice computer getCo
  • 无法在 mongodb 中创建角色

    我正在尝试在 mongodb 中创建一个新角色 但它给了我错误 gt use Admin switched to db Admin gt db createRole role executeFunctions privileges reso
  • 使用属性和性能

    我正在优化我的代码 我注意到使用属性 甚至自动属性 对执行时间有深远的影响 请参阅下面的示例 Test public void GetterVsField PropertyTest propertyTest new PropertyTest
  • SambaFileInputStream 和 FileInputStream 有什么不同?

    我需要从 samba 服务器流式传输视频 并且我使用 nanohttpd 在我的项目中创建简单的服务器 当我使用本地文件中的 fileinputstream 时 视频视图可以按设置播放视频 http localhost 8080 publi
  • 如何在ExtJs商店中使用过滤器?

    我使用 ExtJs 创建了一个商店 我想将商店的值加载到 ComboBox 但在加载值之前 我需要根据另一个组合框中选择的值过滤一些数据 因此 为了这个目的 我认为我需要在商店应用过滤器 请任何人都可以帮助我如何做到这一点 Model Ex
  • 对 Action 方法的两个并行 ajax 请求排队,为什么?

    我正在使用 ASP NET MVC 开发一个视频网站 我希望在我的应用程序中拥有的一项功能是转码视频 但由于转码过程可能非常耗时 我想向客户端用户展示该过程的进度 因此 我的架构是使用一个控制器操作来处理整个转码过程 并将其进度写入存储在服
  • C 中的等效 plpgsql 触发器

    我有一个 PostgreSQL 9 0 服务器 并且在某些表上使用继承 因此我必须通过如下触发器模拟外键 CREATE OR REPLACE FUNCTION othertable before update trigger RETURNS
  • 测试 NSMutableArray 是否包含字符串对象

    我有一个NSMutableArray其中包含一些NSString对象 如何测试数组是否包含特定的字符串文字 I tried array containsObject teststring 但这行不通 你所做的应该很好 例如 NSArray
  • 为什么 Perl 6 的 try 不处理 shell() 中的非零退出?

    This try https docs raku org language exceptions index entry try blocks try捕获异常 try die X AdHoc say Got to the end 输出显示程
  • kubernetes 部署的缩写是什么?

    For kubectl describe我可以缩写几类资源 例如 po xxx gt pods xxx rs xxx gt replicasets xxx 我在哪里可以找到完整列表 我正在尝试查找部署的缩写 获取您的资源的完整列表 包括他们
  • awk 维度上的累积和

    下午好 我想对 awk 中的每一列和每一行进行累积和 我的文件是 1 2 3 42 5 6 72 3 6 51 2 1 2 我想要 每列 1 2 3 43 7 9 115 10 15 166 12 16 186 12 16 18 我想要 每
  • 将“C# 友好类型”名称转换为实际类型:“int” => typeof(int)

    我想得到一个System Type给定一个string指定 原始 类型C 友好名称 基本上与 C 编译器读取 C 源代码时的方式相同 我觉得描述我所追求的最好方式是单元测试的形式 我希望存在一种通用技术 可以使以下所有断言通过 而不是尝试对