是否可以以基本上将自身作为委托返回的方式定义函数?
例如,如果这是有效的语法:
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));
答案 0 :(得分:14)
是的,你可以,你自己的委托声明:
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;
}
......但对我来说似乎没用。你真的想要这样做的原因,而不仅仅是三个单独的电话?例如,我有一个Preconditions.CheckNotNull
返回非空值 - 说实话,我觉得比看起来更有用了。
如注释中所述,上述仅适用于所有参数属于同一类型(或者所有参数都可隐式转换为第一个参数的类型)的情况。允许使用位进行链接的替代方法是使用具有泛型方法的单例实例:
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));
使用两个单独的方法,一个是静态的,一个不是(但名称不同),您可以删除Instance
部分。例如:
NullChecker.Scrub(param1, nameof(param1))
.And(param2, nameof(param2))
.And(param3, nameof(param3));
答案 1 :(得分:1)
如果你把它作为扩展方法:
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)));
不完全是你想要的。