2016-03-30 24 views
-1

Ich habe eine Liste von Zeichenfolgen, die einen anderen Namen für Ereignistypen hätten. Der Code ist unten,Klasse dynamisch in C# aus einer Liste von Zeichenfolgen erstellen

public class Main 
{ 
    public void Run() 
    { 
     List<string> classList = new List<string> 
      { 
       "Event_one", 
       "Event_two" 
      }; 


     foreach (string item in classList) 
     { 
      IEvent ent; 
      switch (item) 
      { 
       case "Event_one": 
        ent = new EventOne(); 
        ent.HandlEvent(); 
        break; 
       case "Event_two": 
        ent = new EventTwo(); 
        ent.HandlEvent(); 
        break; 
      } 
     } 
    } 
} 

public class EventOne : IEvent 
{ 
    public void HandlEvent() 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class EventTwo : IEvent 
{ 
    public void HandlEvent() 
    { 
     throw new NotImplementedException(); 
    } 
} 

public interface IEvent 
{ 
    void HandlEvent(); 
} 

Wie kann ich die switch-Anweisung entfernen und den Code lockerer gekoppelt machen ?. Mein Code befindet sich in der Website/App_code.

+0

'entfernen Sie den Schalter statement', was genau wollen Sie dann? Sie möchten eindeutig ein Factory-Muster, aber Sie müssen eine Art von Test auf Ihre Eingabe durchführen, um zu wissen, welche Instanz Sie wollen. Sie könnten Reflektion verwenden, aber ich würde nicht argumentieren, dass es in Ihrem Fall besser ist, bis Sie einen Grund haben, es zu benutzen. – Jonesopolis

+1

Sie könnten anstelle einer switch-Anweisung ein Wörterbuch verwenden, das den Code ein wenig sauberer macht. Siehe https://gist.github.com/jcebuck/6d57e70761ebabf1a3aa83fb27af077a –

+0

@james Buck danke das ist viel sauberer. – Joshua

Antwort

0

Verwenden Sie eine Factory, die eine Instanz von IEvent aus einer Zeichenfolge zurückgibt, und rufen Sie dann HandlEvent auf. Das bedeutet jedoch im Wesentlichen, dass Sie den Schalter in der Fabrik bewegen.

+0

Ja, aber ich möchte es ohne den Schalter tun. – Joshua

+0

Nun, Sie müssen früher oder später eine Entscheidung treffen, aber Ihr Code würde Ihre Entscheidung abstrahieren. Wenn die Strings tatsächliche Typnamen wären, könnten Sie Code verwenden, um den Typ basierend auf dem Namen zu erhalten, und dann eine Instanz davon mit Activator abrufen. –

0

Sie können Reflection verwenden, um den Typ zu instanziieren, der durch den Namen/Bezeichner angegeben wird (möglicherweise mit einer zusätzlichen Abstraktion durch ein Attribut für die Typen, die Namen zugeordnet werden sollen).

0

Sie können etwas tun:

public void Run() 
    { 
     List<string> classList = new List<string> 
     { 
      "EventOne", 
      "EventTwo" 
     }; 

     string assemblyName = Assembly.GetExecutingAssembly().GetName().Name; 

     foreach (string item in classList) 
     { 
      IEvent ent = Activator.CreateInstance(Type.GetType(assemblyName + "." + item)) as IEvent; 
      if (ent != null) 
       ent.HandlEvent(); 
     } 
    } 
Verwandte Themen