如何在C#中获取类型的原始名称?

Jor*_*dan 22 c# reflection

我正在使用反射来打印方法签名,例如

foreach (var pi in mi.GetParameters()) {
    Console.WriteLine(pi.Name + ": " + pi.ParameterType.ToString());
}
Run Code Online (Sandbox Code Playgroud)

这很好用,但它打印出基元类型为"System.String"而不是"string"和"System.Nullable`1 [System.Int32]"而不是"int?".有没有办法在代码中查找参数的名称,例如

public Example(string p1, int? p2)
Run Code Online (Sandbox Code Playgroud)

版画

p1: string
p2: int?
Run Code Online (Sandbox Code Playgroud)

代替

p1: System.String
p2: System.Nullable`1[System.Int32]
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 34

编辑:我在下面的答案中错了一半.

看看CSharpCodeProvider.GetTypeOutput.示例代码:

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

class Test
{
    static void Main()
    {
        var compiler = new CSharpCodeProvider();
        // Just to prove a point...
        var type = new CodeTypeReference(typeof(Int32));
        Console.WriteLine(compiler.GetTypeOutput(type)); // Prints int
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这并没有转化Nullable<T>T?- 我找不到任何可以使它这样做的选项,虽然这并不意味着这样的选项不存在:)


框架中没有任何东西可以支持这一点 - 毕竟,它们是C#特有的名称.

(请注意,string 不是一个原始类型,顺便.)

你必须通过发现Nullable`1自己来做到这一点,并从完整的框架名称到每个别名都有一个映射.