在以下方法中,我想访问 Action 中包含的任何可选参数:
public static class ValidatorEngine
{
public static void Validate(Action someMethodWithOptionalArguments)
{
object target = someMethodWithOptionalArguments.Target;
}
}
所以如果我这样调用这个方法:
ValidatorEngine.Validate(() => UpdateByModel(model));
我希望能够访问传递到 Action 中的模型参数。我什至对调用此操作不感兴趣。
我认为可以使用 Action 的 Target 属性来完成某些操作,因为我可以在调试时看到模型。我只是无法以编程方式弄明白。
最佳答案
如果您想检查它但不执行它,这是Expression
的主要示例.只需更改 Action
中的签名即可至 Expression<Action>
.这将为您提供一个可以分析的表达式树。对于基本示例:
public static class ValidatorEngine
{
static void Main()
{
string model = "abc";
ValidatorEngine.Validate(() => UpdateByModel(model));
}
public static void Validate(Expression<Action> action)
{
var methodCall = action.Body as MethodCallExpression;
if (methodCall == null) throw new InvalidOperationException("Expected a method-call");
Console.WriteLine("Method: " + methodCall.Method.DeclaringType.Name + "." + methodCall.Method.Name);
var parameters = methodCall.Method.GetParameters();
for (int i = 0; i < parameters.Length; i++)
{
Console.WriteLine(parameters[i].Name + ": " + Evaluate(methodCall.Arguments[i]));
}
}
static object Evaluate(Expression exp)
{
switch (exp.NodeType)
{
case ExpressionType.Constant:
return ((ConstantExpression)exp).Value;
case ExpressionType.MemberAccess:
var me = (MemberExpression)exp;
switch (me.Member.MemberType)
{
case System.Reflection.MemberTypes.Field:
return ((FieldInfo)me.Member).GetValue(Evaluate(me.Expression));
case MemberTypes.Property:
return ((PropertyInfo)me.Member).GetValue(Evaluate(me.Expression), null);
default:
throw new NotSupportedException(me.Member.MemberType.ToString());
}
default:
throw new NotSupportedException(exp.NodeType.ToString());
}
}
static void UpdateByModel(object model) {
throw new NotImplementedException();
}
}
要支持更丰富的节点和场景集,请参阅 this richer version .
关于c# - 您如何访问委托(delegate)目标方法参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5131981/