如何将具有枚举属性的对象映射到具有值的对象?

时间:2017-12-26 14:50:37

标签: c# enums mapper

请帮帮我。我上课了。

public class ProductModel
{
    public long ProductId { get; set; }

    public int ContainerType { get; set; }

    public SolidForm SolidForm { get; set; }
}

SolidForm是Enum。

public enum SolidForm
{

    None = 0,

    Molten = 1,

    Solution = 2,

    InPowderedForm = 3
}

我需要创建另一个模型For Example

public class Product
{
    public long ProductId { get; set; }

    public int ContainerType { get; set; }

    public int SolidForm { get; set; }
}

其中属性SolidForm是Enum的值。

例如,如果我进入第一个模型SolidForm = SolidForm.Molten
在产品中进行转换之后我想要获得int SolidForm = 1

谢谢。

4 个答案:

答案 0 :(得分:1)

虽然存在多个答案,但您可以执行以下操作:

public TType ConvertEnum<TType, TEnum>(TEnum content) 
{
     var validated = typeof(TEnum);
     if(!validated.IsEnum)
          throw new Exception("Non enum passed.");

     var conversion = content as TType;
     if(conversion != null)
          return conversion;

     return default(TType);
}

一个干净的可重用方法,加上它应该支持不同类型的转换,检查小提琴并且似乎在大多数实现中都能正常工作。

因此,在您的情况下,当您设置属性的值时,它将是:

Product.SolidForm = ConvertEnum<int, SolidForm>(SolidForm.Molten);

我认为默认情况下这一切:

public enum SolidForm
{
     None,
     Molten,
     Solution
}

您的代码似乎不需要相等,因为它代表默认的递增方法,因为您没有覆盖这些值。

  

默认情况下,第一个枚举数的值为0,值为   每个连续的枚举数增加1.例如,在   在枚举之后,Sat为0,Sun为1,Mon为2,依此类推。

     

复制enum Days {周六,周日,周一,周二,周三,周四,周五};调查员可以   使用初始值设定项覆盖默认值,如下所示   以下示例。

     

复制enum Days {Sat = 1,Sun,Mon,Tue,Wed,Thu,Fri};在这   枚举,元素序列被强制从1开始   而不是0.但是,包含值为0的常量是   推荐的。有关更多信息,请参阅枚举类型。一切   枚举类型具有基础类型,可以是任何整数   除char之外的类型。枚举元素的默认基础类型   是int。要声明另一个整数类型的枚举,例如byte,请使用   标识符后面跟着类型的冒号,如图所示   以下示例。

更新:

public static TDestination MapProperty<TSource, TDestination>(TSource source, TDestination destination)
{
    PropertyInfo[] sourceProperties = typeof(source).GetProperties();
    foreach(var property in sourceProperties)
    {
        var destinationProperty = typeof(TDestination).GetProperty(property.Name);
        if(destinationProperty != null)
        {
            // Error handling, validation of type, a bunch of other checks should go here.
            var value = ((destinationProperty.PropertyType)property.GetValue(source, null));
            destinationProperty.SetValue(destination, value, null);
        }
    }

    return destination;
}

重要的是要注意,这将需要大量的异常处理。因为您必须了解枚举,可空类型等,以避免转换失败。此外,如果您的代码具有如此大的对象,则反射可能会很慢。

此代码的基础知识,循环遍历源对象,在目标对象上查找匹配,然后执行原始强制转换,然后设置值,然后返回目标对象。您可能还需要Activator.CreateInstance(typeof(Destination));我在没有编译器的情况下编写代码非常快,因此如上所述,我需要进行改进。这应该是一个坚实的起点。

答案 1 :(得分:0)

是那样的?

        Product p = new Product
        {
            SolidForm = (int)SolidForm.Solution
        };

答案 2 :(得分:0)

Enum to int

  

(INT)ProductModel.SolidForm

int to enum

  

(SolidForm)Enum.ToObject(typeof(SolidForm),ProductModel.SolidForm)

您使用的是哪种映射器?

你可以在你的枚举声明中列出枚举,如果它们按顺序排列

答案 3 :(得分:0)

你可以直接从enum转换为int只使用类型转换

(int) SolidForm;