【发布时间】:2011-10-11 20:51:55
【问题描述】:
假设我有以下代码
private Func<T> _method;
public void SetExecutableMethod<T>(Func<T> methodParam)
{
_method = methodParam;
}
public T ExecuteMethod(object[] parameterValues)
{
//get the number of parameters _method has;
var methodCallExpression = _method.Body as MethodCallExpression;
var method = methodCallExpression.Method;
ParameterInfo[] methodParams = method.GetParameters();
//So i now have a list of parameters for the method call,
//How can i update the parameter values for each of these?
for (int i = 0; i < parameters.Count(); i++ )
{
methodParams[i] = ???''
}
return _method.Compile()();
}
public void InitAndTest()
{
SetExecutableMethod( () => _service.SomeMethod1("param1 placeholder", "param2 placeholder") );
T result1 = ExecuteMethod(new object[]{"Test1", "Test2"});
T result2 = ExecuteMethod(new object[]{"Test3", "Test4"}););
}
在上面的代码中,我想为某个指向匿名函数的 Func 设置一个私有变量,并且永远不必再次设置它。 然后我希望能够使用不同的参数调用 ExecuteMethod(...) 。此方法应更新变量_method 的参数值,然后调用该方法。 我可以很好地读取参数的数量及其值,我只是不确定如何设置这些参数的值?对此有什么想法吗?
【问题讨论】:
-
你能解释一下最终目标是什么吗?您打算如何使用可以接受任意数量参数的对象,并以任意方式处理它们?调用代码如何知道将什么传递给该对象?如果你的意图更清楚一点,可能会有更好的方法来完成它。
-
我正在为服务调用实现一个通用缓存处理程序。缓存键将是方法本身 + 参数的哈希码。该值将是方法调用的结果。这基本上允许我实现一个不知道或不关心传递给方法的东西的类,只需要执行方法并缓存结果以供以后检索。
-
我已经用一个基本示例更新了我的答案。请记住,哈希码不能是 actual 键。你的缓存(字典)可能会计算一个哈希码来加速搜索,但你应该确保每个参数都实现了一个
IEqualityComparer或覆盖了它的Equals方法,然后比较它们。
标签: c# expression-trees anonymous-methods