从字符串列表中在c#中动态创建类

时间:2016-03-30 19:43:38

标签: c# .net design-patterns

我有一个字符串列表,它有不同的事件类型名称。代码如下,

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中。

3 个答案:

答案 0 :(得分:0)

使用将从字符串返回IEvent实例的Factory,然后在其上调用HandlEvent。但是,这基本上意味着您正在工厂中移动开关。

答案 1 :(得分:0)

您可以使用反射来实例化您拥有的名称/标识符指定的类型(可能通过类型的属性进行额外的抽象来映射名称)。

答案 2 :(得分: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();
        }
    }