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

问题描述 投票:1回答:4

请帮我。我上课了。

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

谢谢。

c# enums mapper
4个回答
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));我在没有编译器的情况下编写代码的速度非常快,因此如上所述,我需要进行改进。这应该是一个坚实的起点。


0
投票

像那样?

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

0
投票

枚举到int

(INT)ProductModel.SolidForm

int到枚举

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

你用的是什么映射器?

您可以在枚举声明中列出枚举,只要它们按顺序排列即可


0
投票

您可以直接从枚举转换为int只使用类型转换

(int) SolidForm;
© www.soinside.com 2019 - 2024. All rights reserved.