6

我想知道如何在数组中获取方法的传入参数。或者只是动态地检索我的参数的值。

意思是,像这样的调用:

MyMethod(10, "eleven");

对于方法:

void MyMethod(int Test, str Test2) {}

将在一个数组中解析,如:

{{"Test" => 10}, {"Test2", "eleven"}}

如果我能通过反射实现这一点会更好。例如。以某种方式使用 StackTrace。

4

6 回答 6

3

我认为,您正在寻找的东西不存在。您可以拥有的最接近的是参数:

MyMethod(params object[] args) 
{
    // if you have to do this, it's quite bad:
    int intArg = (int)args[0];
    string stringArg = (string)arg[1]:
}

// call with any number (and type) of argument
MyMethod(7, "tr");

没有编译时类型检查,因此它不是处理参数的万能方法。但如果你的论点动态的,它可能是一个解决方案。


编辑:有另一个想法:

您需要将所有参数手动放入列表/字典中。您可以编写一个助手类以允许以下操作:

MyMethod(int arg1, string arg2) 
{
    Arguments.Add(() => arg1);
    Arguments.Add(() => arg2);
    //
}

助手看起来像这样

public static void Add<T>(Expression<Func<T>> expr)
{
    // run the expression to get the argument value
    object value = expr.Compile()();
    // get the argument name from the expression
    string argumentName = ((MemberExpression)expr.Body).Member.Name;

    // add it to some list:
    argumentsDic.Add(argumentName, value);
}
于 2009-05-07T08:42:20.633 回答
2

最好的选择是使用匿名类型,如本例所示。

于 2009-05-07T08:39:46.333 回答
0

Maybe this won't be exactly what you were looking for, but I found I could get a reasonable compromise for my situation using a variation on the method Matt Hamilton suggested and making use of the implicit naming of anonymous type parameters:

public void MyMethod(string arg1, bool arg2, int arg3, int arg4)
{
    var dictionary = new PropertyDictionary(new 
    { 
        arg1, arg2, arg3, arg4 
    });
}

public class PropertyDictionary : Dictionary<string, object>
{
    public PropertyDictionary(object values)
    {
        if(values == null)
            return;

        foreach(PropertyDescriptor property in TypeDescriptor.GetProperties(values))
            Add(property.Name, property.GetValue(values);   
    }
}    

As I said, it may not be helpful in your situation, but in mine (unit testing a method which processes XML) it was very useful.

于 2012-12-11T00:16:00.503 回答
0

好问题(+1)。我想这就是你需要的——

MethodBase mb = MethodBase.GetCurrentMethod();
ParameterInfo[] pi = mb.GetParameters();
于 2009-05-07T08:47:11.853 回答
0

我知道的一种方法(不确定它是否是当今唯一的方法,但它曾经是)是使用面向方面的编程(AOP),尤其是拦截。手动滚动它有点痛苦,但是有一些出色的工具可以提供帮助。PostSharp 就是这样一种工具:http ://www.postsharp.org/ 。

于 2009-05-07T08:52:47.050 回答
0

由于该方法使用命名参数,为什么不能直接用它们的名称和值显式填充字典?由于您已经知道它们,因此使用反射来获取它们的名称没有什么意义。

如前所述,params 关键字可用于定义具有可变数量参数的方法,但根据定义,这些参数是无名的。

我不确定你在问什么,按照你解释的方式,有什么意义。也许您可以进一步详细说明?

于 2009-05-07T09:03:24.297 回答