我想知道如何在数组中获取方法的传入参数。或者只是动态地检索我的参数的值。
意思是,像这样的调用:
MyMethod(10, "eleven");
对于方法:
void MyMethod(int Test, str Test2) {}
将在一个数组中解析,如:
{{"Test" => 10}, {"Test2", "eleven"}}
如果我能通过反射实现这一点会更好。例如。以某种方式使用 StackTrace。
我想知道如何在数组中获取方法的传入参数。或者只是动态地检索我的参数的值。
意思是,像这样的调用:
MyMethod(10, "eleven");
对于方法:
void MyMethod(int Test, str Test2) {}
将在一个数组中解析,如:
{{"Test" => 10}, {"Test2", "eleven"}}
如果我能通过反射实现这一点会更好。例如。以某种方式使用 StackTrace。
我认为,您正在寻找的东西不存在。您可以拥有的最接近的是参数:
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);
}
最好的选择是使用匿名类型,如本例所示。
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.
好问题(+1)。我想这就是你需要的——
MethodBase mb = MethodBase.GetCurrentMethod();
ParameterInfo[] pi = mb.GetParameters();
我知道的一种方法(不确定它是否是当今唯一的方法,但它曾经是)是使用面向方面的编程(AOP),尤其是拦截。手动滚动它有点痛苦,但是有一些出色的工具可以提供帮助。PostSharp 就是这样一种工具:http ://www.postsharp.org/ 。
由于该方法使用命名参数,为什么不能直接用它们的名称和值显式填充字典?由于您已经知道它们,因此使用反射来获取它们的名称没有什么意义。
如前所述,params 关键字可用于定义具有可变数量参数的方法,但根据定义,这些参数是无名的。
我不确定你在问什么,按照你解释的方式,有什么意义。也许您可以进一步详细说明?