2016-12-03 6 views
5

के साथ दोहराव कोड मैं आरपीसी (प्रोटोबफ-रिमोट) के साथ काम कर रहा हूं और मुझे दूसरे छोर (सर्वर) के नीचे कुछ जांच करने की आवश्यकता है।सी # शून्य जांच

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 सर्वर डाउन है, तो मैं आवश्यक वस्तु के मूलभूत मूल्यों मिल जाएगा।

उत्तर

5

आप इस तरह के विस्तार विधि बना सकते हैं: इस प्रयोग के लिए

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)); 
+0

या 'वर पहले = rpc.GetObject (? R => आर प्रथम (ए, बी)) ; ' – NtFreX

+1

@ डॉफ्रे जिसकी आवश्यकता नहीं है। यदि आर शून्य है, तो पहले वैसे भी नहीं बुलाया जाएगा। –

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 या पुरातन, और rpc कभी नहीं देता है उनके लिए null कर रहे हैं, आप कर सकते हैं इस:

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

और यह

फोन 0

नोट ?. में ? जो आप null संदर्भ अपवाद से ढालें।

संबंधित मुद्दे