【问题标题】:using reflection to get the name of a parameter使用反射获取参数的名称
【发布时间】:2010-12-16 23:24:31
【问题描述】:

我有一个 c# .net 2.0CF 应用程序,我不仅想获取传递给函数的参数的类型和值,还想获取变量名。

例如:

void Show<PARAM>(PARAM p)
{
    Debug.WriteLine(string.Format("{0} {1} = {2}", typeof(PARAM).ToString, ???, p.ToString() );
}

bool foo = true;
Show(foo);

会输出“bool foo = true”;

在 C++ 中,我可以使用 ## 预处理器宏来做到这一点。

如果这在 2.0 中做不到,那么在 3.5 或 4.0 中可以做到吗?

谢谢, 保罗H

【问题讨论】:

标签: c# reflection compact-framework


【解决方案1】:

如果我没记错的话,反射是不可能的,因为变量名不在程序集中,p 是一个变量名。

【讨论】:

    【解决方案2】:
    using System.Reflection;
    
    
    ParameterInfo[] info = MethodInfo.GetCurrentMethod().GetParameters();
    System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(false);
    System.Diagnostics.StackFrame[] frames = trace.GetFrames();
    

    我猜该值可以从堆栈帧中检索。

    参数名称可以从

    中找到

    ParameterInfo[] info = MethodInfo.GetCurrentMethod().GetParameters();

    【讨论】:

    • StackTrace 和 StackFrame 在 Compact Framework 中不可用。
    • 另外,这不是真的。 StackFrame 仅包含文件、行和列以及MethodBase。都不包含原始参数名称。
    【解决方案3】:
    public void Show(int value)
        {
            ParameterInfo[] info = MethodInfo.GetCurrentMethod().GetParameters();
            Trace.WriteLine(string.Format("{0} {1}={2}", info[0].ParameterType.ToString(), info[0].Name, value.ToString()));
        }
    

    输出

    System.Int32 值=10

    【讨论】:

    • 很遗憾,CF 没有 MethodInfo.GetCurrentMethod()。
    • 尝试使用 PostSharp,它支持 Compact Framework。
    【解决方案4】:

    尝试使用 PostSharp,它支持 Compact Framework。

    【讨论】:

      猜你喜欢
      • 2010-10-11
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      相关资源
      最近更新 更多