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

本文关键字:情况下 int 转换 枚举 类型 不知道 | 更新日期: 2023-09-27 18:35:24

我目前正在重构一个大型代码库并将其从 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 将以整数形式出现。 对于其他类型的 SetProperty 方法中还有其他逻辑。 o属性可以是应用程序中数百个枚举中的任何一个。

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

如果valueFromDataSource是一个object,并且只是有问题的盒装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创建者也无法做到这一点

更新以更动态地执行此操作,对 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
相关文章: