c# - 您如何访问委托(delegate)目标方法参数?

标签 c# .net

在以下方法中,我想访问 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/

相关文章:

c# - 在 List<T> 中查找 IEnumerable<T> 时,GetGenericTypeDefinition 返回 false

c# - 使用 Crystal Reports 从 SQL DB 中获取单行

.net - 如何将一列添加到 rdlc 的数据集中并让它出现在报告中以供使用?

c# - .NET 服务的 user.config 位于何处?

c# - 需要数组的可变参数函数的设计决策是什么?

c# - Windows 8 Metro 本地主机查找

c# - 值不能为空 - 应用程序管理器

.net - 如何使用 msbuild 生成 specflow feature.cs 文件?

c# - .NET Core - 在 C# 代码中获取项目描述

c# - 使用 ProcessInfo 用户名和密码调用 wkhtmltopdf 时无法读取 StandardOutput