[CSharpTips]利用ConvertHelper解决System.Convert.ChangeType无法转换Int类型为枚举类型

利用ConvertHelper解决System.Convert.ChangeType无法转换Int类型为枚举类型

遇到需要将Int类型通过System.Convert.ChangeType转换为对应枚举类型时报错,代码如下

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConvertHelper
{
    class Program
    {
        public enum Sex
        {
            Male,
            Female
        }
        public class Student
        {
            public string Name { get; set; }
            public int ID { get; set; }
            public Sex Sex { get; set; }

        }

        static void Main(string[] args)
        {

            Student student = new Student();

            var nameProperty = student.GetType().GetProperty("Name");
            var sexProperty = student.GetType().GetProperty("Sex");

            Object newName = "李四";
            Object newSex = 1;

            nameProperty.SetValue(student, Convert.ChangeType(newName, nameProperty.PropertyType), null);

            sexProperty.SetValue(student, Convert.ChangeType(newSex, sexProperty.PropertyType), null);

            Console.WriteLine("Name: "+student.Name);
            Console.WriteLine("Sex: " + student.Sex);
            Console.ReadLine();
        }
    }
}
复制代码

运行时会产生如下报错,无法从Int类型转换为Enum类型

添加ConvertHelper类如下

复制代码
        public static class ConvertHelper
        {
            #region = ChangeType =
            public static object ChangeType(object obj, Type conversionType)
            {
                return ChangeType(obj, conversionType, System.Threading.Thread.CurrentThread.CurrentCulture);
            }

            public static object ChangeType(object obj, Type conversionType, IFormatProvider provider)
            {

                #region Nullable
                Type nullableType = Nullable.GetUnderlyingType(conversionType);
                if (nullableType != null)
                {
                    if (obj == null)
                    {
                        return null;
                    }
                    return Convert.ChangeType(obj, nullableType, provider);
                }
                #endregion
                if (typeof(System.Enum).IsAssignableFrom(conversionType))
                {
                    return Enum.Parse(conversionType, obj.ToString());
                }
                return Convert.ChangeType(obj, conversionType, provider);
            }
            #endregion
        }
复制代码

修改原代码,使用ConvertHelper.ChangeType() 方法

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConvertHelper
{
    class Program
    {
        public enum Sex
        {
            Male,
            Female
        }
        public class Student
        {
            public string Name { get; set; }
            public int ID { get; set; }
            public Sex Sex { get; set; }

        }

        public static class ConvertHelper
        {
            #region = ChangeType =
            public static object ChangeType(object obj, Type conversionType)
            {
                return ChangeType(obj, conversionType, System.Threading.Thread.CurrentThread.CurrentCulture);
            }

            public static object ChangeType(object obj, Type conversionType, IFormatProvider provider)
            {

                #region Nullable
                Type nullableType = Nullable.GetUnderlyingType(conversionType);
                if (nullableType != null)
                {
                    if (obj == null)
                    {
                        return null;
                    }
                    return Convert.ChangeType(obj, nullableType, provider);
                }
                #endregion
                if (typeof(System.Enum).IsAssignableFrom(conversionType))
                {
                    return Enum.Parse(conversionType, obj.ToString());
                }
                return Convert.ChangeType(obj, conversionType, provider);
            }
            #endregion
        }

        static void Main(string[] args)
        {

            Student student = new Student();

            var nameProperty = student.GetType().GetProperty("Name");
            var sexProperty = student.GetType().GetProperty("Sex");

            Object newName = "李四";
            Object newSex = 1;

            nameProperty.SetValue(student, ConvertHelper.ChangeType(newName, nameProperty.PropertyType), null);

            sexProperty.SetValue(student, ConvertHelper.ChangeType(newSex, sexProperty.PropertyType), null);

            Console.WriteLine("Name: "+student.Name);
            Console.WriteLine("Sex: " + student.Sex);
            Console.ReadLine();
        }
    }
}
复制代码

则可以成功运行

 

 注:

ConvertHelper类非原创

感谢 https://blog.csdn.net/leewhoee/article/details/8968015 DePaul大佬提供的解决方案

 

posted @   xiaoshuye  阅读(414)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示