使用枚举来选择要实例化的类

我有一个枚举,我试图联系到dto的:

 public enum DtoSelection
 {
     dto1,
     dto2,
     dto3,
 }

这个枚举中有108个值。

我有这些dto的每个dto对象:

 public class dto1 : AbstractDto
 {
       public int Id { get; set; }
       //some stuff specific to this dto
 }

我正在尝试创建一个方法(最终是一个服务),它将返回一个与该dto关联的类型的新dto对象:

 private AbstractDto(int id)
 {
      if (id == DtoSelection.Dto1.ToInt()) //extension method I wrote for enums
            return new Dto1();
      if (id == DtoSelection.Dto2.ToInt())
            return new Dto2();
 }

显然我不想这样做108次。 无论出于什么原因,我的大脑只是缺少一些明显的东西 处理这个问题的最好方法是什么?


只要Dto类在与AbstractDto相同的名称空间中定义,该类就会做你想做的事情(如果不是,你需要调整它):

鉴于以下枚举和类:

public enum DtoSelection
{
    Dto1,
    Dto2,
    Dto3,
}

public abstract class AbstractDto
{
}

public class Dto1 : AbstractDto
{
}

public class Dto2 : AbstractDto
{
}

public class Dto3 : AbstractDto
{
}

这种方法将解决它们:

public static class DtoFactory
{
    public static AbstractDto Create(DtoSelection dtoSelection)
    {
        var type = Type.GetType(typeof(AbstractDto).Namespace + "." + dtoSelection.ToString(), throwOnError: false);

        if (type == null)
        {
            throw new InvalidOperationException(dtoSelection.ToString() + " is not a known dto type");
        }

        if (!typeof(AbstractDto).IsAssignableFrom(type))
        {
            throw new InvalidOperationException(type.Name + " does not inherit from AbstractDto");
        }

        return (AbstractDto)Activator.CreateInstance(type);
    }
}

使用Activator.CreateInstance方法并传递枚举的ToString值。

Type type = Type.GetType(DtoSelection.dto1.ToString());
var temp = Activator.CreateInstance(type);

我会使用一个funcs字典。

Dictionary<DtoSelection, Func<AbstractDto>> dictionary = 
        new Dictionary<DtoSelection, Func<AbstractDto>>
{
    {DtoSelection.dto1, () => new dto1()}
};

var dto = dictionary[DtoSelection.dto1]();
链接地址: http://www.djcxy.com/p/91507.html

上一篇: Use an enum to select which class to instantiate

下一篇: Loop through a C# enum's keys AND values