【问题标题】:Get parameter values from method at run time在运行时从方法中获取参数值
【发布时间】:2012-08-26 10:21:33
【问题描述】:

我有当前方法示例:

public void MethodName(string param1,int param2)
{
    object[] obj = new object[] { (object) param1, (object) param2 };
    //Code to that uses this array to invoke dynamic methods
}

是否有一种动态方式(我猜是使用反射)来获取当前执行的方法参数值并将它们放置在对象数组中?我读过您可以使用 MethodBase 和 MethodInfo 获取参数信息,但这些信息仅包含有关参数的信息,而不是我需要的值本身。

因此,例如,如果我将“test”和 1 作为方法参数传递而没有对特定参数进行编码,是否可以获得具有两个索引 {“test”, 1 } 的对象数组?

我真的不想使用第三方 API,但如果它有该 API 的源代码,那么我会接受它作为答案,只要它不是一个庞大的 API 并且没有简单的方法可以做到没有这个 API。

我相信一定有办法,也许使用堆栈,谁知道呢。你们是专家,这就是我来这里的原因。

提前谢谢你,我迫不及待想看看这是怎么做到的。

编辑

可能不清楚,所以这里有一些额外的信息。这个代码示例就是这样,一个显示我想要的示例。在需要的地方显示实际代码会显得臃肿而庞大,但问题是如何在不手动创建数组的情况下获取数组。我需要一些如何在不编码特定参数的情况下获取值并将它们放入数组中的方法。

【问题讨论】:

  • 不清楚你想要什么。您已经在显示的代码中的数组中包含参数。这有什么问题?
  • 为什么需要这个?当您在方法中时,您已经知道参数并且可以轻松地将它们放入数组中(如您的示例所示)。
  • 关键字params 可能有用,如果您想要接收数组中未知长度的参数列表:public void MethodName(params object[] parameters)
  • 这只是一个例子。在需要它的地方显示实际代码会很臃肿,但问题是如何在不手动创建数组的情况下获取数组。编辑我的问题。

标签: c#-4.0 reflection methods parameters runtime


【解决方案1】:

使用反射可以提取参数名称和元数据,但不能提取实际值:

  class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            p.testMethod("abcd", 1);
            Console.ReadLine();
        }

        public void testMethod(string a, int b)
        {
            System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();
            StackFrame sf = st.GetFrame(0);
            ParameterInfo[] pis = sf.GetMethod().GetParameters();

            foreach (ParameterInfo pi in pis)
            {
                Console.Out.WriteLine(pi.Name);
            }
        }
    }

【讨论】:

  • 所以在运行时获取值是不可能的?
  • 你可能想使用类似 PostSharp AOP 风格的方法,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 2014-01-10
相关资源
最近更新 更多