函数返回返回函数的函数等

时间:2016-08-02 21:34:30

标签: c#

是否可以以基本上将自身作为委托返回的方式定义函数?

例如,如果这是有效的语法:

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));

2 个答案:

答案 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)));

不完全是你想要的。

相关问题