2016-03-30 56 views
-1

我有一個字符串列表,它將具有不同的事件類型名稱。代碼如下:在c#中從字符串列表中動態創建類

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

如何刪除switch語句並使代碼更鬆散耦合? 我的代碼位於網站/ app_code內。

+0

'刪除開關statement'你到底要什麼呢?你顯然需要一個工廠模式,但是你必須對你的輸入做一些測試,以知道你想要哪個實例。你可以使用反射,但我不會爭辯說,直到你有理由使用它,它纔會更好。 – Jonesopolis

+1

您可以使用字典而不是switch語句,這可能會使代碼更清晰一些。見https://gist.github.com/jcebuck/6d57e70761ebabf1a3aa83fb27af077a –

+0

@詹姆斯巴克感謝這是更清潔。 – Joshua

回答

0

使用工廠將從字符串中返回一個IEvent實例,然後在其上調用HandlEvent。但是,這基本上意味着您正在工廠中切換開關。

+0

是的,但我想不做切換。 – Joshua

+0

那麼,你必須遲早作出決定,但是你的代碼會將你的決定抽象出來。如果字符串是實際的類型名稱,可以使用一些代碼來獲取基於名稱的類型,然後使用Activator獲取它的實例。 –

0

您可以使用反射來實例化您所擁有的名稱/標識符指定的類型(可能需要通過映射名稱類型的屬性進行額外的抽象)。

0

你可以做這樣的事情:

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