如何在C#中将引用传递给静态方法作为函数参数?

3

我需要使用NLog库中的Swallow(Func)方法。

重要提示:我从一个静态方法中调用Swallow,并想传递一个静态方法。

它的文档在这里:

http://nlog-project.org/documentation/v3.2.1/html/Overload_NLog_Logger_Swallow.htm

第一个案例(Swallow(Action))(传递没有参数的静态方法)很简单:
static void ParameterlessMethodThatCasts ()
{
   throw NotImplementedException("Not implemented yet");
}

...
// Code in some method that uses static instance of nLog
nLog.Instance.Swallow( ParameterlessMethodThatCasts );

很不幸,第二个 (Swallow<T>(Func<T>)) 和第三个 (Swallow<T>(Func<T>, T)) 重载没有提供示例,这两种情况下都传递了带参数的方法引用。
我在其他地方也没有找到合适的示例。
我已经尝试过:
`Object.TypeOf()` 

而且 var t = typeof(MyMethod);

两者在语法上都不正确。

我应该在这里使用什么语法来传递具有参数的方法的引用(即链接中的第二个和第三个重载)?

除了传递委托之外,还有其他方法吗?


也许我需要创建一个委托并传递它,就像这个线程中建议的那样: https://dev59.com/YHI95IYBdhLWcg3w8iz1?rq=1 - Sold Out
1个回答

2
您可以传递一个 Func<T> 或者 Func<T, T>,但也许使用匿名lambda表达式更为适合:
() => this.ParameterlessMethodThatCasts("A", "B", 1, 2)

由于这个签名与第一个重载匹配,您可以传入任何想要的参数。

Func<T>Func<T, T> 可以匹配这样的方法(其中 T 在这种情况下是 string):

private string SomeMethod(); // Func<T>

并且这个:

private string SomeMethod(string arg1); // Func<T, T>

Patrick:谢谢你的建议。我忘记了说明它是在静态方法环境中进行的。我已经在问题中进行了修正。 - Sold Out
那么这会如何改变我的答案? - Patrick Hofman
Patrick 你说得对!我移除了类型规范Swallow<MyType>,现在它可以编译了。看起来正是我想要的 :) 让我检查一下。 - Sold Out
好的。很好!@Peter - Patrick Hofman
Patrick:再次感谢!你刚刚教会我如何创建一个用于本地使用并作为参数传递的特别委托 :) 我想知道,相对于创建静态委托并始终传递该委托的选项,这是否会增加指令周期消耗。 - Sold Out

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接