我正在使用反射来打印方法签名,例如
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自己来做到这一点,并从完整的框架名称到每个别名都有一个映射.