首页 > 解决方案 > 传递成员名称作为参数

问题描述

是否可以只传递不带参数的方法/函数(成员)的名称?类似于 Moq 所做的事情:

    Mock<Foo>fooMoq = new Mock<Foo>();
    fooMoq.Setup(f => f.DummyMethod(It.IsAny<string>()));

但是,如果没有 It.IsAny ():

    Mock<Foo> fooMoq = new Mock<Foo>();
    fooMoq.Setup(f => f.DummyMethod);

我的意思不是在起订量的背景下,而是在一般情况下。谢谢。

编辑:我要获取的是成员的名称,以便稍后拦截对该方法的调用。这就是为什么我对知道将传递给方法的哪些参数不感兴趣,我只想知道他们要拦截哪些方法。

标签: c#genericslambda

解决方案


不,您不能从 lambda 参数的实例传递方法。您可以获得的最接近的是使用方法组转换。但是,您并没有真正指定要实现的目标。

OP编辑后:

没有更简单的方法可以做到这一点,这就是为什么像 MOQ 这样的流行框架要求您传递所有必需的参数。这样做的一种常见方法是只传递一个只有空值(或值类型的默认值)的方法,如下所示:

fooMoq.Setup(f => f.DummyMethod(null,null,null));

还有另一种方法允许您不传递任何参数,但您会丢失对方法类型的静态类型检查,因此您可以在那里传递任何方法名称。阅读它也会有更多问题,因为您只有方法名称和类型,这在阅读重载函数时可能会导致问题。

public class Program
{
    public static void Main()
    {
       Setup<Test>(nameof(Test.DummyMethod));
    }

    public static void Setup<T>(string methodName)
    {

    }
}

public class Test
{
    public void DummyMethod()
    {

    }
}

推荐阅读