2016-03-29 6 views
0

Ich musste einen WCF-Dienstvertrag auflösen, der eine massive Schnittstelle und eine Clientbase-Klasse in kleinere Klassen hatte. Alle kleineren Klassen sind ähnlich, haben jedoch unterschiedliche Betriebsverträge. Ich möchte in der Lage sein, die Operationsvertragsmethoden in allen neuen Unterklassen aus Gründen der Abwärtskompatibilität als eine einzelne Klasse verfügbar zu machen. Im Idealfall wäre es so etwas wie folgt aussehen:Methoden in Eigenschaften als einzelne Klasse anzeigen

public class MainClient { 

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

    public static Sub1Client Sub1; 
    public static Sub2Client Sub2; 
} 

Ich würde dann Methoden in der Lage sein möchten, rufen Sie von Sub1 und Sub2, als ob diese Methoden in MainClient definiert wurden. Anstatt also (new MainClient()).Sub1.Method1() anzurufen, würde ich (new MainClient()).Method1() anrufen, wo Method1 noch in der Sub1Client Klasse existiert.

Ist das möglich?

+2

Sie sollten Method1 in MainClient erklären, und im Inneren des MainClient.Method1 ist ein Aufruf an die Sub1.Method1. –

+0

Ah, das macht Sinn. Logistisch gesehen ist es jedoch ein Albtraum. Ich schaue mir eine Klasse an, die 500K + Zeilen umfasst, die in mindestens 45 Sub-Clients mit ~ 2K-Operations-Verträgen aufgeteilt werden müssen, um XML-Serialisierung relativ schnell zu machen. Es ist alles Regex und Gebete von hier aus. –

+0

Goodluck Bruder. :) –

Antwort

1

ich nicht sicher, dass deutlich verstehe Ihre Frage, aber überprüfen Sie diese solution:

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