一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

C# 中利用反射機(jī)制拷貝類的字段和屬性(拷貝一個(gè)類對(duì)象的所有東西付給另一個(gè)類對(duì)象,而不是付給引用地址)

 賈朋亮博客 2011-04-22

有時(shí)候,需要把一個(gè)類的相同名稱的字段、屬性相互賦值,難道要一句一句代碼的寫?在數(shù)據(jù)庫操作的模型中,視圖模型和表模型有一定的字段是同名的,很多時(shí)候可能需要從視圖模型復(fù)制到表模型,或者反過來。。。
重復(fù)勞動(dòng)是比較郁悶,我又比較懶。所以寫了個(gè)轉(zhuǎn)換器:


    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    using System.Reflection;
    using System.Collections;

namespace SilverlightApplication1
    {
        /// <summary>
        /// 類屬性/字段的值復(fù)制工具
        /// </summary>
        public class ClassValueCopier
        {
            /// <summary>
            /// 復(fù)制
            /// </summary>
            /// <param name="destination">目標(biāo)</param>
            /// <param name="source">來源</param>
            /// <returns>成功復(fù)制的值個(gè)數(shù)</returns>
            public static int Copy(object destination, object source)
            {
                if (destination == null || source == null)
                {
                    return 0;
                }
                return Copy(destination, source, source.GetType());
            }
     
            /// <summary>
            /// 復(fù)制
            /// </summary>
            /// <param name="destination">目標(biāo)</param>
            /// <param name="source">來源</param>
            /// <param name="type">復(fù)制的屬性字段模板</param>
            /// <returns>成功復(fù)制的值個(gè)數(shù)</returns>
            public static int Copy(object destination, object source, Type type)
            {
                return Copy(destination, source, type, null);
            }
     
            /// <summary>
            /// 復(fù)制
            /// </summary>
            /// <param name="destination">目標(biāo)</param>
            /// <param name="source">來源</param>
            /// <param name="type">復(fù)制的屬性字段模板</param>
            /// <param name="excludeName">排除下列名稱的屬性不要復(fù)制</param>
            /// <returns>成功復(fù)制的值個(gè)數(shù)</returns>
            public static int Copy(object destination, object source, Type type, IEnumerable<string> excludeName)
            {
                if (destination == null || source == null)
                {
                    return 0;
                }
                if (excludeName == null)
                {
                    excludeName = new List<string>();
                }
                int i = 0;
                Type desType = destination.GetType();
                foreach (FieldInfo mi in type.GetFields())
                {
                    if (excludeName.Contains(mi.Name))
                    {
                        continue;
                    }
                    try
                    {
                        FieldInfo des = desType.GetField(mi.Name);
                        if (des != null && des.FieldType == mi.FieldType)
                        {
                            des.SetValue(destination, mi.GetValue(source));
                            i++;
                        }
     
                    }
                    catch
                    {
                    }
                }
     
                foreach (PropertyInfo pi in type.GetProperties())
                {
                    if (excludeName.Contains(pi.Name))
                    {
                        continue;
                    }
                    try
                    {
                        PropertyInfo des = desType.GetProperty(pi.Name);
                        if (des != null && des.PropertyType == pi.PropertyType && des.CanWrite && pi.CanRead)
                        {
                            des.SetValue(destination, pi.GetValue(source, null), null);
                            i++;
                        }
     
                    }
                    catch
                    {
                        //throw ex;
                    }
                }
                return i;
            }
        }
     
        #region 擴(kuò)展方法 For .NET 3.0+
        /// <summary>
        /// 類屬性/字段的值復(fù)制工具 擴(kuò)展方法
        /// </summary>
        public static class ClassValueCopier2
        {
            /// <summary>
            /// 獲取實(shí)體類的屬性名稱
            /// </summary>
            /// <param name="source">實(shí)體類</param>
            /// <returns>屬性名稱列表</returns>
            public static List<string> GetPropertyNames(this object source)
            {
                if (source == null)
                {
                    return new List<string>();
                }
                return GetPropertyNames(source.GetType());
            }
            /// <summary>
            /// 獲取類類型的屬性名稱(按聲明順序)
            /// </summary>
            /// <param name="source">類類型</param>
            /// <returns>屬性名稱列表</returns>
            public static List<string> GetPropertyNames(this Type source)
            {
                return GetPropertyNames(source, true);
            }
            /// <summary>
            /// 獲取類類型的屬性名稱
            /// </summary>
            /// <param name="source">類類型</param>
            /// <param name="declarationOrder">是否按聲明順序排序</param>
            /// <returns>屬性名稱列表</returns>
            public static List<string> GetPropertyNames(this Type source, bool declarationOrder)
            {
                if (source == null)
                {
                    return new List<string>();
                }
                var list = source.GetProperties().AsQueryable();
                if (declarationOrder)
                {
                    list = list.OrderBy(p => p.MetadataToken);
                }
                return list.Select(o => o.Name).ToList(); ;
            }
     
            /// <summary>
            /// 從源對(duì)象賦值到當(dāng)前對(duì)象
            /// </summary>
            /// <param name="destination">當(dāng)前對(duì)象</param>
            /// <param name="source">源對(duì)象</param>
            /// <returns>成功復(fù)制的值個(gè)數(shù)</returns>
            public static int CopyValueFrom(this object destination, object source)
            {
                return CopyValueFrom(destination, source, null);
            }
     
            /// <summary>
            /// 從源對(duì)象賦值到當(dāng)前對(duì)象
            /// </summary>
            /// <param name="destination">當(dāng)前對(duì)象</param>
            /// <param name="source">源對(duì)象</param>
            /// <param name="excludeName">排除下列名稱的屬性不要復(fù)制</param>
            /// <returns>成功復(fù)制的值個(gè)數(shù)</returns>
            public static int CopyValueFrom(this object destination, object source, IEnumerable<string> excludeName)
            {
                if (destination == null || source == null)
                {
                    return 0;
                }
                return ClassValueCopier.Copy(destination, source, source.GetType(), excludeName);
            }
     
            /// <summary>
            /// 從當(dāng)前對(duì)象賦值到目標(biāo)對(duì)象
            /// </summary>
            /// <param name="source">當(dāng)前對(duì)象</param>
            /// <param name="destination">目標(biāo)對(duì)象</param>
            /// <returns>成功復(fù)制的值個(gè)數(shù)</returns>
            public static int CopyValueTo(this object source, object destination)
            {
                return CopyValueTo(destination, source, null);
            }
     
            /// <summary>
            /// 從當(dāng)前對(duì)象賦值到目標(biāo)對(duì)象
            /// </summary>
            /// <param name="source">當(dāng)前對(duì)象</param>
            /// <param name="destination">目標(biāo)對(duì)象</param>
            /// <param name="excludeName">排除下列名稱的屬性不要復(fù)制</param>
            /// <returns>成功復(fù)制的值個(gè)數(shù)</returns>
            public static int CopyValueTo(this object source, object destination, IEnumerable<string> excludeName)
            {
                if (destination == null || source == null)
                {
                    return 0;
                }
                return ClassValueCopier.Copy(destination, source, source.GetType(), excludeName);
            }
     
        }
        #endregion
    }

說明:

1,只能復(fù)制相同名稱,相同類型的字段、屬性
2,可以選擇只復(fù)制某個(gè)父類、接口下的字段和屬性
3,如果你的 .NET 版本不是 3.0及以上,得刪掉擴(kuò)展方法和 Linq 的引用

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    中文字字幕在线中文乱码二区| 日韩成人高清免费在线| 日韩特级黄片免费观看| 日韩一区二区三区在线欧洲 | 国产欧美一区二区色综合| 日本成人中文字幕一区| 亚洲国产成人久久一区二区三区| 加勒比系列一区二区在线观看| 亚洲淫片一区二区三区| 国产精品丝袜一二三区| 精产国品一二三区麻豆| 美女黄片大全在线观看| 丝袜破了有美女肉体免费观看 | 中日韩免费一区二区三区| 丰满少妇高潮一区二区| 中日韩美一级特黄大片| 日韩欧美中文字幕av| 久草国产精品一区二区| 伊人国产精选免费观看在线视频 | 日本91在线观看视频| 台湾综合熟女一区二区| 色狠狠一区二区三区香蕉蜜桃 | 国产精品伦一区二区三区在线| 亚洲精品日韩欧美精品| 99久久国产精品成人观看| 久久99青青精品免费| 亚洲熟妇熟女久久精品 | 东北女人的逼操的舒服吗| 在线中文字幕亚洲欧美一区| 亚洲精品小视频在线观看| 麻豆国产精品一区二区三区| 内用黄老外示儒术出处| 人妻精品一区二区三区视频免精 | 欧美韩国日本精品在线| 可以在线看的欧美黄片| 亚洲一区二区三区av高清| 日韩中文字幕有码午夜美女| 亚洲国产另类久久精品| 国产精品99一区二区三区| 色婷婷视频国产一区视频| 黄色av尤物白丝在线播放网址 |