如何在设计时不知道类型的情况下将int转换为Enum?

时间:2014-12-24 22:39:30

标签: c# enums

我目前正在重构大型代码库并将其从vb.net转换为c#。其中一个函数在从数据源加载列并将它们放入属性中时做了一些时髦的逻辑。

使用vb,创建者并不需要担心转换等问题,但使用c#我需要考虑它。

因此,给定一段如下所示的代码,我需要将int转换为相关的枚举类型。

    public class SomeType
    {
         public SomeEnum enumValue { get; set; }

         public void SetValues()
         {
              ... GetValuesFromDataSource

              ... Iterates values

              enumValue = SetProperty(enumValue, valueFromDataSource);
         }
    }

    protected dynamic SetProperty(object oProperty, object oValue)
    {
         if (oProperty is Enum)
         {
              ... Convert oValue to the relevant enum type and assign to oProperty
         }
    }

只是为了增加一些清晰度。对SetProperty数字的引用数以千计,所以我不想手工重构。

oValue将以int形式出现。其他类型的SetProperty方法中还有其他逻辑。 oProperty可以是应用程序中数百个枚举中的任何一个。

2 个答案:

答案 0 :(得分:0)

使用SetProperty方法的out参数

更新以更动态地执行此操作
class Program
{
    static void Main(string[] args)
    {
        Entity tt = default(Entity);
        Test tester = default(Test);
        tester = SetProperty(tester, 5);
        tt = SetProperty(tt, "Test7");


        Console.WriteLine(tester);
        Console.WriteLine(tt);
        Console.ReadLine();
    }

    public static T Cast<T>(T target, object Source)
    {
        return (T)Source;
    }

    public static dynamic SetProperty<T>(T target, object source)
    {
        Type t = typeof(T);
        Type sourceType = source.GetType();
        if (t.IsEnum)
        {
            Type enumType = t.GetEnumUnderlyingType();

            if (Type.Equals(sourceType, enumType))
            {
                return (T)Cast(Activator.CreateInstance(enumType), source);
            }
            if (Type.Equals(sourceType, typeof(string)))
            {
                Array names = t.GetEnumValues();
                foreach (var name in names)
                {
                    if (name.ToString() == source.ToString())
                    {
                        return (T)name;
                    }
                }
            }
            return default(T);
        }
        return null;
    }

    public enum Entity
    {
        Test5,
        Test7,
        Test8
    }

    public enum Test : int
    {
        Test1 = 1,
        Test2 = 5,
        Test4 = 7
    }
}

输出将是:

Test2
Test7

答案 1 :(得分:0)

如果valueFromDataSourceobject并且只是问题的框enum,您可以使用以下内容

if (valueFromDataSource is someEnum)
{
  return (someEnum)valueFromDataSource
}
else if (valueFromDataSource is someOtherEnum)
{
  return (someOtherEnum)valueFromDataSource            
}

但是,在您的原始功能中,您将返回object,这将再次装箱,没有任何收获

这让我相信你的valueFromDataSource实际上是int,因此,没有办法回来,你最多只能猜测enum应该是什么

在设计方案中,您最好的选择不是将枚举存储为int,而只是将其加入

其次是给枚举类型或其他东西留一个提示

<强>更新

can you convert an int to an Enum without knowing the type at design time?

不幸的是答案是否定的,在VB或C#或任何其他语言中,它只是无法完成

如果您的重新分解代码,您必须有一些电线交叉,因为VB创建者无法做到这一点