我试图编写一个名为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是一个类或结构,那么通过执行重载或执行静态测试,没有成功将两个函数重新组合在一个泛型函数中。
如何只使用一个通用函数来编写它?
答案 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的参考和值类型。