2016-03-29 14 views
0

Büyük bir arabirim ve istemci sınıfı sınıfı olan bir WCF hizmet sözleşmesini daha küçük sınıflara ayırmam gerekiyordu. Bütün küçük sınıflar benzerdir ancak farklı operasyon sözleşmeleri vardır. Tüm yeni alt sınıflardaki operasyonel sözleşme yöntemlerini geriye dönük uyumluluk için tek bir sınıf olarak ortaya koyabilmek istiyorum. İdeal böyle görünecektir:Tek Sınıflı Özelliklerde Yöntemleri Göster

public class MainClient { 

    public MainClient() { 
     Sub1 = new Sub1Client(); 
     Sub2 = new Sub2Client(); 
    } 

    public static Sub1Client Sub1; 
    public static Sub2Client Sub2; 
} 

Sonra bu yöntemlerin MainClient tanımlanan sanki Sub1 ve Sub2 gelen yöntemleri çağırmak mümkün olmasını isterim. Yani (new MainClient()).Sub1.Method1()'u çağırmak yerine sınıfında Method1 sınıfının bulunduğu (new MainClient()).Method1()'u arardım.

Bu mümkün mü?

+2

Sen MainClient içinde Method1 beyan ve MainClient.Method1 iç Sub1.Method1 için bir çağrıdır olmalıdır. –

+0

Ah, bu mantıklı. Mantıksal olarak olsa da, bu bir kabus. Ben, sadece xml serileştirmeyi makul derecede hızlı yapmak için ~ 2K işlem sözleşmeleriyle en az 45 alt istemciye bölünmesi gereken 500K + satırları olan bir tanrı sınıfına bakıyorum. Dışarıdan gelen tüm rejeks ve dualar. –

+0

Goodluck kardeşim. :) –

cevap

1

açıkça sorunuzu anlıyorum ama bu solution kontrol emin değil:

public interface IFirst 
{ 
    void Method1(string a); 
} 

public interface ISecond 
{ 
    double Method2(int b, bool a); 
}  

public interface IComplex : IFirst, ISecond 
{ 
} 

public class MyException : Exception 
{ 
    public MyException(string message) : base(message) 
    { 
    } 
} 

public class Sub1Client : IFirst 
{ 
    public void Method1(string a) 
    { 
     Console.WriteLine("IFirst.Method1"); 
     Console.WriteLine(a); 
    } 
} 

public class Sub2Client : ISecond 
{ 
    public double Method2(int b, bool a) 
    { 
     Console.WriteLine("ISecond.Method2"); 
     return a ? b : -b; 
    } 
} 

public class MainClient : IComplex 
{ 
    public MainClient() 
    { 
     Sub1 = new Sub1Client(); 
     Sub2 = new Sub2Client(); 
    } 

    public static Sub1Client Sub1; 
    public static Sub2Client Sub2;   

    private T FindAndInvoke<T>(string methodName, params object[] args) 
    { 
     foreach(var field in this.GetType().GetFields(BindingFlags.Public | BindingFlags.Static)) 
     { 
      var method = field.FieldType.GetMethod(methodName); 
      if(method != null) 
       return (T)method.Invoke(field.GetValue(this), args); 
     } 
     throw new MyException("Method was not found!"); 
    } 

    public void Method1(string a) 
    {    
     FindAndInvoke<object>(MethodBase.GetCurrentMethod().Name, a);    
    } 

    public double Method2(int b, bool a) 
    { 
     return FindAndInvoke<double>(MethodBase.GetCurrentMethod().Name, b, a); 
    } 
}  

public static void Main() 
{ 
    var test = new MainClient(); 
    test.Method1("test"); 
    Console.WriteLine(test.Method2(2, true)); 
} 
İlgili konular