2016-12-03 9 views
5

Pracuję z RPC (protobuf-remote) i muszę zrobić pewne sprawdzenie w przypadku, gdy drugi koniec (serwer) jest wyłączony. Powiedzmy, że mam wiele jest metod RPC, jak:C# Powtarzalny kod z zerową kontrolą

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

Czy mimo to zmienić powtarzające null sprawdzania kodu? Abym mógł napisać coś takiego:

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

Który zrobi zerowej kontroli oraz by utworzyć obiektu przez swojego typu, jeżeli serwer RPC jest w dół, więc będę się domyślne wartości wymaganego przedmiotu.

Odpowiedz

5

Można utworzyć taką metodę rozszerzenia:

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

dla tego zastosowania:

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

lub 'var (? .First r => r (a, b)) = rpc.GetObject pierwszy ; ' – NtFreX

+1

@ Dr.Fre, który nie jest potrzebny. Jeśli r ma wartość null, First nie będzie tak nazywane. –

2

Można uprościć kod z ogólnej metody:

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

Jeśli FirstObj, SecondObj i ThirdObj typy są wszystkie klasy, nie struct S lub prymitywów i rpc nigdy nie powraca null dla nich, można zrobić to:

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

i nazwać

Uwaga: ? w ?., która chroni przed wyjątkami referencyjnymi od null.

Powiązane problemy