带参数约束的重载功能或找到其他地方的方法

时间:2015-07-09 08:26:21

标签: c#

我试图编写一个名为NotNull的函数,它的工作方式类似于#34;。"。

例如:

a.NotNull( x => x.AFunc )

如果a为null,则NotNull返回泛型类型的AFunc,否则NotNull返回AFunc的返回值。

我写道:

public static TReturn NotNullClass<TObject, TReturn>(this TObject obj, Func<TObject, TReturn> func) where TReturn : class
{
    if (obj == null)
    {
        return null;
    }
    else
    {
        return func(obj);
    }
}

public static TReturn NotNullStruct<TObject, TReturn>(this TObject obj, Func<TObject, TReturn> func) where TReturn : struct
{
    if (obj == null)
    {
        return new TReturn();
    }
    else
    {
        return func(obj);
    }
}

问题是,如果TReturn是一个类或结构,那么通过执行重载或执行静态测试,没有成功将两个函数重新组合在一个泛型函数中。

如何只使用一个通用函数来编写它?

1 个答案:

答案 0 :(得分:1)

    public static TReturn NotNull<TObject, TReturn>(this TObject obj, Func<TObject, TReturn> func)
    {
        if (object.ReferenceEquals(obj, null))
        {
            return default(TReturn);
        }

        return func(obj);
    }

此扩展方法可用于引用类型和值类型(对于TObject)。对于值类型(结构),条件始终为true,并将调用给定的func。

由于default(TReturn),此方法也适用于TReturn的参考和值类型。