使用 lambda 语法选择方法表达式,忽略重载

发布于 2024-10-06 07:23:38 字数 572 浏览 1 评论 0原文

我目前使用以下扩展方法来选择方法:

    public static MethodInfo GetMethod<TType>(this TType type, 
                           Expression<Action<TType>> methodSelector) 
                           where TType : class
    {
        return ((MethodCallExpression)methodSelector.Body).Method;
    }

调用方式如下:

this.GetMethod(x => x.MyMethod(null,null))

选择哪种方法对我来说并不重要,我只是使用它来强获取方法名称- 键入的方式。有没有办法让我仍然可以使用 lambda 语法选择方法但不指定任何参数?

IE

 this.GetMethod(x => x.MyMethod)

I currently use the following extension method in order to select a method:

    public static MethodInfo GetMethod<TType>(this TType type, 
                           Expression<Action<TType>> methodSelector) 
                           where TType : class
    {
        return ((MethodCallExpression)methodSelector.Body).Method;
    }

This is called like this:

this.GetMethod(x => x.MyMethod(null,null))

It doesn't matter to me which method I'm selecting, I'm simply using this as way to get the method name in a strongly-typed way. Is there a way that I can still select the method using the lambda syntax but not specify any arguments?

I.e.

 this.GetMethod(x => x.MyMethod)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

墨落画卷 2024-10-13 07:23:38

这似乎可行,但由于必须为采用参数的方法指定签名而增加了成本。我不知道如何自动获取这些。

public static class ObjectExtensions
{
    public static MethodInfo GetMethod<TType, TSignature>(this TType type, Expression<Func<TType, TSignature>> methodSelector) where TType : class
    {
        var argument = ((MethodCallExpression)((UnaryExpression)methodSelector.Body).Operand).Arguments[2];
        return ((ConstantExpression)argument).Value as MethodInfo;
    }

    public static MethodInfo GetMethod<TType>(this TType type, Expression<Func<TType, Action>> methodSelector) where TType : class
    {
        return GetMethod<TType, Action>(type, methodSelector);
    }
}

用这个简单的例子进行测试:

public class MyClass
{
    public static void RunTest()
    {
        var m = new MyClass().GetMethod(x => x.Test);
        Console.WriteLine("{0}", m);

        m = new MyClass().GetMethod<MyClass, Action<int>>(x => x.Test2);
        System.Console.WriteLine("{0}", m);
        Console.ReadKey();
    }

    public void Test()
    {
    }

    public void Test2(int a)
    {
    }
}

This seems to work, but with the added cost of having to specify signatures for methods which take parameters. I couldn't work out how to get those automatically.

public static class ObjectExtensions
{
    public static MethodInfo GetMethod<TType, TSignature>(this TType type, Expression<Func<TType, TSignature>> methodSelector) where TType : class
    {
        var argument = ((MethodCallExpression)((UnaryExpression)methodSelector.Body).Operand).Arguments[2];
        return ((ConstantExpression)argument).Value as MethodInfo;
    }

    public static MethodInfo GetMethod<TType>(this TType type, Expression<Func<TType, Action>> methodSelector) where TType : class
    {
        return GetMethod<TType, Action>(type, methodSelector);
    }
}

Tested with this simple example:

public class MyClass
{
    public static void RunTest()
    {
        var m = new MyClass().GetMethod(x => x.Test);
        Console.WriteLine("{0}", m);

        m = new MyClass().GetMethod<MyClass, Action<int>>(x => x.Test2);
        System.Console.WriteLine("{0}", m);
        Console.ReadKey();
    }

    public void Test()
    {
    }

    public void Test2(int a)
    {
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文