2016-12-03 57 views
5

我正在与RPC(protobuf-remote),我需要做一些检查,以防另一端(服务器)关闭。比方说,我一直的RPC方法很多的,如: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(); 
} 

反正是有改变这种重复的空校验码?所以,我可以写的东西,如:

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 => R。首先(A,B)) ;' – NtFreX

+1

@ Dr.Fre不需要。如果r为空,则首先将不会被调用。 –

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

如果FirstObjSecondObjThirdObj类型都是类,而不是struct S或原语和rpc不会返回null对他们来说,你可以做这样的:

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

,并调用它

请注意??.,它可以屏蔽您从null引用异常。