C#重复代码的空值检查

5

我正在使用RPC(protobuf-remote)技术,如果另一端(服务器)出现问题,我需要进行一些检查。假设我有许多RPC方法,例如:

public FirstObj First(string one, string two)
{
    if (rpc == null)
        return (FirstObj)Activator.CreateInstance(typeof(FirstObj));

    return rpc.First(one, two);
}

public SecondObj Second(string one)
{
    if (rpc == null)
        return (SecondObj)Activator.CreateInstance(typeof(SecondObj));

    return rpc.Second(one);
}

public ThirdObj Third()
{
    if (rpc == null)
        return (ThirdObj)Activator.CreateInstance(typeof(ThirdObj));

    return rpc.Third();
}

有没有办法改变这种重复的空值检查代码?这样我就可以写出类似这样的代码:
public FirstObj First(string one, string two)
{
    return rpc.First(one, two);
}

如果RPC服务器宕机,那么它将执行空值检查并按其类型创建对象,以便我可以获得所需对象的默认值。

2个回答

4
您可以创建这样的扩展方法:
public static class RpcExtension
{
    public static T GetObject<T>(this RPC rpc, Func<RPC, T> func)
        where T: class , new ()
    {
        if (rpc == null)
        {
            return Activator.CreateInstance<T>();
        }
        return func(rpc);
    }
}

对于这种用法:

var first = rpc.GetObject(r => r.First(a, b));

或者 var first = rpc.GetObject(r => r?.First(a, b)); - NtFreX
1
@Dr.Fre 那不是必要的。如果 r 是 null,First 方法也不会被调用。 - Maksim Simkin

2
您可以使用通用方法简化代码:
private static T Make<T>() {
    return (T)Activator.CreateInstance(typeof(T));
}
public FirstObj First(string one, string two) {
    return rpc == null ? Make<FirstObj>() : rpc.First(one, two);
}
public SecondObj Second(string one) {
    return rpc == null ? Make<SecondObj>() : rpc.Second(one);
}
public ThirdObj Third() {
    return rpc == null ? Make<ThirdObj>() : rpc.Third();
}

如果FirstObjSecondObjThirdObj类型都是类,而不是struct或基本类型,并且rpc从未返回null,则可以这样做:
public static T RpcOrDefault<T>(T obj) where T : class {
    return obj ?? (T)Activator.CreateInstance(typeof(T));
}

并称之为

FirstObj first = RpcOrDefault(rpc?.First(one, two));
//                               ^

注意在 ?. 中的 ? 可以防止因为 null 引用而导致的异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接