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

この反復的な null チェック コードを変更する方法はありますか? だから私は次のように書くことができます:

public FirstObj First(string one, string two)
{
    return rpc.First(one, two);
}

nullチェックを行い、RPCサーバーがダウンしている場合はそのタイプでオブジェクトを作成するため、必要なオブジェクトのデフォルト値を取得します。

4

2 に答える 2

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

FirstObjSecondObj、およびThirdObj型がすべてクラスであり、structs やプリミティブではなく、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

于 2016-12-03T13:31:09.560 に答える