使用枚举来选择要实例化的类
我有一个枚举,我试图联系到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