2016-12-03 10 views
5

私はRPC(protobuf-remote)と一緒に作業しています。もう一方のサーバ(サーバ)がダウンしている場合にチェックを行う必要があります。C#ヌルチェック付きの繰り返しコード

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

この繰り返し型ヌルチェックコードを変更するにはどうしたらいいですか?だから私のような何か書くことができます:ヌルチェックをするでしょうし、RPCサーバーがダウンしている場合、それのタイプによって、オブジェクトを作成することになり

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

をので、私は必要なオブジェクトのデフォルト値を取得します。

答えて

5

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

や 'VAR最初= rpc.GetObject(?R => R 1次回(b)参照) ; ' – NtFreX

+1

@ Dr.Freは不要です。 rがnullの場合、Firstはとにかく呼び出されません。 –

2

あなたは一般的な方法であなたのコード簡素化することができます:FirstObj場合は、

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

SecondObj、そしてThirdObjタイプはすべてのクラスではなく、struct Sまたはプリミティブであり、rpcが彼らのためにnullを返すことはありません、あなたが行うことができますこの:

public static T RpcOrDefault<T>(T obj) where T : class { 
    return obj ?? (T)Activator.CreateInstance(typeof(T)); 
} 

それを呼び出します0

null参照例外からあなたを守る?.?に注意してください。この使用のために

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

:あなたはこのような拡張メソッドを作成することができ

関連する問題