我有一个我想尝试与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次.无论出于何种原因,我的大脑只是遗漏了一些明显处理这个问题的最佳方法是什么.
解决方法
只要在与AbstractDto相同的命名空间中定义Dto类,此类就可以执行您想要的操作(如果不是,则需要调整它):
鉴于以下枚举和类:
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); } }