C# 将一个对象转换为指定类型

原文地址:点击打开链接

适用:普通的对象,并且有默认的无参数构造函数

  #region 将一个对象转换为指定类型
        /// <summary>
        /// 将一个对象转换为指定类型
        /// </summary>
        /// <param name="obj">待转换的对象</param>
        /// <param name="type">目标类型</param>
        /// <returns>转换后的对象</returns>
        public static object ConvertToObject(object obj, Type type)
        {
            if (type == null) return obj;
            if (obj == null) return type.IsValueType ? Activator.CreateInstance(type) : null;

            Type underlyingType = Nullable.GetUnderlyingType(type);
            if (type.IsAssignableFrom(obj.GetType())) // 如果待转换对象的类型与目标类型兼容,则无需转换
            {
                return obj;
            }
            else if ((underlyingType ?? type).IsEnum) // 如果待转换的对象的基类型为枚举
            {
                if (underlyingType != null && string.IsNullOrEmpty(obj.ToString())) // 如果目标类型为可空枚举,并且待转换对象为null 则直接返回null值
                {
                    return null;
                }
                else
                {
                    return Enum.Parse(underlyingType ?? type, obj.ToString());
                }
            }
            else if (typeof(IConvertible).IsAssignableFrom(underlyingType ?? type)) // 如果目标类型的基类型实现了IConvertible,则直接转换
            {
                try
                {
                    return Convert.ChangeType(obj, underlyingType ?? type, null);
                }
                catch
                {
                    return underlyingType == null ? Activator.CreateInstance(type) : null;
                }
            }
            else
            {
                TypeConverter converter = TypeDescriptor.GetConverter(type);
                if (converter.CanConvertFrom(obj.GetType()))
                {
                    return converter.ConvertFrom(obj);
                }
                ConstructorInfo constructor = type.GetConstructor(Type.EmptyTypes);
                if (constructor != null)
                {
                    object o = constructor.Invoke(null);
                    PropertyInfo[] propertys = type.GetProperties();
                    Type oldType = obj.GetType();
                    foreach (PropertyInfo property in propertys)
                    {
                        PropertyInfo p = oldType.GetProperty(property.Name);
                        if (property.CanWrite && p != null && p.CanRead)
                        {
                            property.SetValue(o, ConvertToObject(p.GetValue(obj, null), property.PropertyType), null);
                        }
                    }
                    return o;
                }
            }
            return obj;
        }
        #endregion
时间: 2024-10-29 08:11:36

C# 将一个对象转换为指定类型的相关文章

对象转换为原始值的实现方法_基础知识

首先,我们要明白原始值得概念 原始值 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置. 引用值 存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处 ----引用了w3c里的概念 原始值,简单点理解就是 null  undefined string number Boolean 这些 对象转换为boolean相对简单 所有的对象(包括数组和函数)都转换成true,包装对象从也是对象,也转换为true 书上是这么说

visual studio-IIS7上出现错误无法将类型为 的 COM 对象强制转换为接口类型 。

问题描述 IIS7上出现错误无法将类型为 的 COM 对象强制转换为接口类型 . 求助:使用visual studio 2015编写设计网站,使用VS的调试工具进行调试可以正常运行.但是部署到IIS7上出现错误无法将类型为"System.__ComObject"的 COM 对象强制转换为接口类型"OpcRcw.Da.IOPCServer".此操作失败的原因是对 IID 为"{39C13A4D-011E-11D0-9675-0020AFD8ADB3}&quo

microsoft office-Word.Application的 COM 对象强制转换为接口类型时报错

问题描述 Word.Application的 COM 对象强制转换为接口类型时报错 asp.net的项目中有个导出word的功能,每当执行 doc = appWord.Documents.Add(ref templateFile, ref objfalse, ref objDocType, ref objtrue); 到这句的时候报错,catch到一个异常 此时,进程里已经产生一个word进程. 在处理异常的时候, doc.Close(ref doNotSaveChanges, ref miss

我引用speech框架,编译没有错,执行的时候报错!无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型。。。。。。

问题描述 usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;usingSystem.Speech.Synthesis;namespaceBank{public

无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型(异步插件协议中使用线程)

问题描述 在WebBrowser的异步插件协议的Start函数入口中,传入参数包括一个接口类型的参数IInternetProtocolSinkSink,当不使用线程时,工作正常,缺点是当响应慢时界面会假死.但是将代码放入线程之后,就会报错:System.InvalidCastException:无法将类型为"System.__ComObject"的COM对象强制转换为接口类型"MyWebBrowser.IInternetProtocolSink".此操作失败的原因是

大家有空帮忙吗?无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 对象强制转换为接口类型

问题描述 无法将类型为"Microsoft.Office.Interop.Excel.ApplicationClass"的COM对象强制转换为接口类型"Microsoft.Office.Interop.Excel._Application".此操作失败的原因是对IID为"{000208D5-0000-0000-C000-000000000046}"的接口的COM组件调用QueryInterface因以下错误而失败:加载类型库/DLL时出错.(异常

将DataRow转成指定类型的类,并返回这个类的对象(带值)_实用技巧

 /// <summary>         /// 将DataRow转换成指定类型         /// </summary>         /// <param name="pDataRow"></param>         /// <param name="pType">实体类</param>         /// <returns></returns>  

C#读取目录下所有指定类型文件的方法

  本文实例讲述了C#读取目录下所有指定类型文件的方法.分享给大家供大家参考.具体分析如下: 首先要引入命名空间:using System.IO; 再写读取方法: ? 1 2 3 4 5 6 7 8 9 10 DirectoryInfo dir = new DirectoryInfo(path); //path为某个目录,如: "D:Program Files" FileInfo[] inf = dir.GetFiles(); foreach (FileInfo finf in inf

C语言指针转换为intptr_t类型

1.前言 今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量.由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类型的指针.感觉很奇怪,为何要将一个指针这样做呢?如是果断上网查查,发现我的感觉是错误的,所以,任何事情不能凭感觉,要弄清楚来龙去脉.先总结一下intptr_t类型,然后介绍指针与intptr_t类型的转换,最后给出测试程序. 2.intptr_t类型 我接触最早的处理器是32位,目前64位处理器发展迅速.数据类型特别是int相关的类型在