2016-12-03 15 views
5

Tôi đang làm việc với RPC (protobuf-remote) và tôi cần thực hiện kiểm tra trong trường hợp đầu kia (máy chủ) bị hỏng. Giả sử tôi có nhiều phương thức RPC, như:C# Mã lặp lại với kiểm tra rỗng

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

Có cách nào để thay đổi mã kiểm tra không lặp lại lặp lại này không? Vì vậy, tôi có thể viết một cái gì đó như:

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

Điều gì sẽ không kiểm tra và sẽ tạo đối tượng theo loại nếu máy chủ RPC bị hỏng, vì vậy tôi sẽ nhận được giá trị mặc định của đối tượng được yêu cầu.

Trả lời

5

Bạn có thể tạo ra phương pháp khuyến nông như:

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

để sử dụng này:

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

Hoặc 'var (? .First r => r (a, b)) đầu tiên = rpc.GetObject ; ' – NtFreX

+1

@ Dr.Fre không cần thiết. Nếu r là null, đầu tiên sẽ không được gọi là anyway. –

2

Bạn có thể đơn giản hóa mã của bạn với một phương pháp chung:

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

Nếu FirstObj, SecondObj, và ThirdObj loại là mọi tầng lớp, không struct s hoặc nguyên thủy, và rpc không bao giờ trả null cho họ, bạn có thể làm này:

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

và gọi nó là

Lưu ý ? trong ?. để bảo vệ bạn khỏi null ngoại lệ tham chiếu.

Các vấn đề liên quan