【问题标题】:Get Values of Parameters of a Method Regardless their number or type C#获取方法参数的值,无论它们的数量或类型 C#
【发布时间】:2013-08-04 15:04:54
【问题描述】:

我想使用 C# 获取任何方法的参数值,即使它们具有不同数量的参数 例如,如果您有以下 3 种方法:

public void method1 (string param1)
{
    List<string> parametervalues = getParameters(this.Method);
}
public void method2 (int param1, string param2)
{
    List<string> parametervalues = getParameters(this.Method);
}
public void method3 (string param1, int param2, bool param3)
{
    List<string> parametervalues = getParameters(this.Method);
}

所以在 getParameters 方法中,它将采用方法名并以字符串列表的形式返回参数的值,而不管参数的数量是否存在。

我达到了一个点,我可以得到参数的数量,但没有如下值

var method = MethodInfo.GetCurrentMethod();
var parameters = method.GetParameters();
List<string> parameterList = new List<string>();
if (parameters.Length > 0)
{
    foreach (var p in parameters)
    {
        parameterList.Add(p.Name);
    }
}

更新:

我找到了另一种方法,使用 (params object[] values) 作为方法参数,如下所示

method1(string a, string b, string c)
{
list<string> = getParameterasList(a,b,c);
}

getParameterasList(params object[] values)
{
            List<string> parameterList = new List<string>();
            if (values.Length > 0)
            {
                foreach (var v in values)
                {
                    parameterList.Add(v.ToString());
                }
            }
return parameterList;
}

【问题讨论】:

  • 不能通过反射得到参数的
  • 这是一种使用反射以外的其他方式获取值的方法吗?
  • 据我所知,没有。

标签: c# methods parameters methodinfo


【解决方案1】:

您可以使用interception 完成此操作。警告:通过它,理解它并正确实施它需要时间。一旦你了解了拦截调用的基础并能够实现它,你就可以获取方法参数的值了。

简单来说,拦截就是拦截对方法的调用的过程,在调用之前做一些你想发生的事情,然后让调用真正发生,然后你有机会在回来的路上对调用做一些事情给来电者。

在这里向您展示一个完整的示例会很困难,但是请按照该链接进行操作,您会没事的。在拦截期间,这就是我们在方法返回异常时获取方法参数值的方式。 (您可以访问IMethodCallMessage,其中包含您需要的信息。)我们这样做是为了记录方法参数:

    private static List<ParameterInformation> GetParameterInfoList(IMethodCallMessage methodCallMessage)
    {
        var = new List<ParameterInformation>();

        // Note: This works even if a parameter's value is null.
        for(int i = 0 ; i < methodCallMessage.ArgCount ; i++)
        {
            parameterInformationList.Add(new ParameterInformation(methodCallMessage.GetArgName(i), methodCallMessage.Args[i]));
        }

        return parameterInformationList;
    }

【讨论】:

  • 您发布的链接转到“MSDN 杂志问题”
  • 4.5 年前还没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多