函数来返回返回函数的函数,等等
本文关键字:函数 返回 等等 | 更新日期: 2023-09-27 17:59:56
是否可以定义一个函数,使其基本上将自己作为委托返回?
例如,如果这是有效语法:
public class Scrub
{
public NotNull NotNull<T>(T value, string name)
{
if (value == null) throw new ArgumentNullException(name);
return NotNull;
}
}
然后我可以像这样将方法调用链接在一起。
Scrub.NotNull(param1, nameof(param1))(param2, nameof(param2)(param3, nameof(param3));
是的,您可以使用自己的委托声明:
delegate SelfReturner<T> SelfReturner<T>(T value, string name);
static SelfReturner<T> NotNull<T>(T value, string name)
{
if (value == null) throw new ArgumentNullException(name);
return NotNull;
}
但这对我来说似乎没有用。你真的想这么做,而不是只打三个单独的电话吗?例如,我有一个返回非null值的Preconditions.CheckNotNull
——老实说,我发现它比看起来有用得多。
正如评论中所指出的,只有当所有参数都是同一类型(或都可以隐式转换为第一个参数的类型)时,上述方法才有效。允许使用位进行链接的另一种方法是使用带有通用方法的singleton实例:
public sealed class NullChecker
{
public static NullChecker Instance { get; } = new NullChecker();
private NullChecker() {}
public static NullChecker Scrub<T>(T value, string paramName) where T : class
{
if (value == null)
{
throw new ArgumentNullException(paramName);
}
return this;
}
}
用作:
NullChecker.Instance.Scrub(param1, nameof(param1))
.Scrub(param2, nameof(param2))
.Scrub(param3, nameof(param3));
使用两个独立的方法,一个是static,另一个不是(但名称不同),可以删除Instance
部分。例如:
NullChecker.Scrub(param1, nameof(param1))
.And(param2, nameof(param2))
.And(param3, nameof(param3));
如果您将其作为扩展方法:
public static class Scrub
{
public static T NotNull<T, U>(this T value, U property, string name)
{
if (property == null) throw new ArgumentNullException(name);
return value;
}
}
你可以做:
test.NotNull(test.A, nameof(testA.A).NotNull(test.B, nameof(testA.B)));
不是你想要的。