2016-12-03 11 views
5

RPC (protobuf-remote)로 작업 중이며 다른 쪽 (서버)이 다운 된 경우에 대비하여 몇 가지 검사를 수행해야합니다. RPC 메소드가 많이 있다고 가정 해 보겠습니다.null check가있는 반복 코드

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- 확인 코드를 변경하는 방법이 있습니까? 그래서 내가 좋아하는 뭔가를 쓸 수있다 : 널 (null) 검사를 할 것입니다 및 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 좁은 방 (A, B)) ; ' – NtFreX

+1

@ Dr.Fre는 필요하지 않습니다. r가 null의 경우, First는 어쨌든 호출되지 않습니다. –

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

경우 FirstObj, 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); 
    } 
} 

: 당신은 확장 메서드를 만들 수