捕获KeyValuePair数组中的传入参数值

时间:2009-05-07 08:33:48

标签: c# reflection arguments

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

意思是,像这样的呼叫:

MyMethod(10, "eleven");

方法:

void MyMethod(int Test, str Test2) {}

将在以下数组中解析:

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

如果我能用反射实现这一目标会更好。以某种方式使用StackTrace。

6 个答案:

答案 0 :(得分:3)

我认为,你所寻找的并不存在。你最接近的是params:

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);
}

答案 1 :(得分:2)

您最好的选择是使用匿名类型,如this example

所示

答案 2 :(得分:0)

好问题(+1)。我认为这就是你所需要的 -

MethodBase mb = MethodBase.GetCurrentMethod();
ParameterInfo[] pi = mb.GetParameters();

答案 3 :(得分:0)

我知道的一种方式(不确定它是否是现在的唯一方式,但它曾经是)是使用面向方面编程(AOP),特别是拦截。手动滚动它有点痛苦,但有一些出色的工具可以解决。其中一个工具是PostSharp:http://www.postsharp.org/

答案 4 :(得分:0)

由于该方法使用的是命名参数,为什么不能只使用名​​称和值显式填充字典?因为您已经了解它们,所以使用反射获取它们的名称几乎没有意义。

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

我不确定你问的是什么,就像你解释它的方式一样,没有任何意义。也许你可以进一步详细说明?

答案 5 :(得分:0)

也许这不完全是你想要的,但我发现我可以使用Matt Hamilton建议的方法的变体并利用匿名类型参数的隐式命名来对我的情况做出合理的妥协: / p>

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);   
    }
}    

正如我所说,它可能对您的情况没有帮助,但在我的(单元测试处理XML的方法)中它非常有用。