【问题标题】:Invoke an instance method from a expression从表达式调用实例方法
【发布时间】:2015-08-20 18:23:38
【问题描述】:

我试图弄清楚如何使用提供给方法的参数调用表达式中描述的实例方法。

这里有一个类似的问题:How to call the method from a MethodCallExpression in c#,但它是在非实例方法的上下文中运行的。我的问题是:如何在调用之前使用适当的实例构建表达式。

void Main()
{
    Expression<Action<MyClass>> expr = x => x.SomeMethod("Nathan", 10, 1.5d); 

    // i need to provide the expression a new MyClass()

    Expression.Lambda(expr).Compile().DynamicInvoke();
}

public class MyClass 
{
    public void SomeMethod(string param1, int param2, double param3) {
        Console.WriteLine ("Hello: {0}, {1}, {2}", param1, param2, param3);
    }
}

【问题讨论】:

  • 有什么问题?似乎它必须是如何做你在评论中所说的(“我需要为表达式提供一个新的 MyClass()”),但是是什么阻止你这样做呢?
  • @31eee384 我觉得我的问题的最后一段清楚地表明我不确定如何用实例填充 Action。也就是说,我已经改写了,希望你喜欢......
  • 啊,我想对某事“不确定”对我来说不是一个可以回答的问题。我建议使用问号:它们清楚地表明问题在哪里,并迫使句子听起来像一个问题。不过,我仍然不确定“建立”是什么意思。 (以防万一你这么认为,我不是反对者。所以,如果答案对你有用,请随意忽略我——一切都很好。)

标签: c# expression


【解决方案1】:

如果只需要调用表达式,则需要编译为delegate,然后调用:

Expression<Action<MyClass>> expr = x => x.SomeMethod("Nathan", 10, 1.5d); 
Action<MyClass> action = expr.Compile();

MyClass instance = new MyClass();
action(instance);

【讨论】:

  • 废话!这太明显了。谢谢你。我最初提到的问题完全把我引向了错误的方向。
  • @NathanTaylor 但是,我的回答 answer 是您的问题吗? :O
  • @NathanTaylor 好吧,我问你这个是因为我不确定你是否需要进一步的细节;P BTW,谁知道为什么有人拒绝我的回答......
猜你喜欢
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多