【问题标题】:Get MethodInfo Signature获取 MethodInfo 签名
【发布时间】:2012-05-18 19:20:31
【问题描述】:

假设您有一个与方法 myMethod 相关的 MethodInfo:

void myMethod(int param1, int param2) { }

并且您想创建一个表示方法签名的字符串:

string myString = "myMethod (int, int)";

通过 MethodInfo 参数循环,我能够通过调用参数类型的 ToString 方法来实现这些结果:

"myMethod (System.Int32, System.Int32)"

我该如何改进这一点并产生如上所示的结果?

【问题讨论】:

  • myMethod 的大小写不应该改变——你只是指Sysetm.Int32int 部分吗?
  • 抱歉,这是一个错字,现已更正。是的,我的问题在于以声明的方式显示类型的名称。我想知道是否有比为每种类型硬编码字符串更好的解决方案。

标签: c# string reflection signature methodinfo


【解决方案1】:

这个问题以前有人问过,可以通过 CodeDom api 完成。请参阅 thisthis。请注意,这些关键字(int、bool 等)是特定于语言的,因此如果您为一般 .NET 使用者输出这些关键字,通常首选框架类型名称。

【讨论】:

    【解决方案2】:

    据我所知,没有任何内置功能可以将原语 (System.Int32) 的 real 类型名称转换为内置别名 (int)。由于这些别名的数量很少,因此编写自己的方法并不难:

    public static string GetTypeName(Type type) 
    {
        if (type == typeof(int))  // Or "type == typeof(System.Int32)" -- same either way
            return "int";
        else if (type == typeof(long))
            return "long";
        ...
        else
            return type.Name;     // Or "type.FullName" -- not sure if you want the namespace
    }
    

    话虽如此,如果用户确实确实输入了System.Int32 而不是int(这当然是完全合法的),这种技术仍然会打印出“int”。对此您无能为力,因为System.Type 的任何一种方式都是相同的——因此您无法找出用户实际输入的变体。

    【讨论】:

    • IIRC CodeDom 中有一些东西可以做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    相关资源
    最近更新 更多