自己创建c#中的BeanUtils

本文介绍了如何利用C#的反射特性,自定义一个BeanUtils类,实现对象属性的动态拷贝,以此来弥补C#中缺乏类似Apache Commons BeanUtils的工具库的不足。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

apache的jakarta小组有个很著名的组件Commons, 这是一系列由许多细小的类库组成的工具,其中有个BeanUtils,它实现了动态创建bean,以及从bean中获取属性等操作。

事实上c#里的反射也是很强大的,只不过一直没有什么人象jakarta小组那么热心来免费提供可重用的BeanUtils,实在是一个遗憾。

最近再做一个项目,要用到这样的功能,即从一个对象里拷贝所有的字段属性,到另一个对象中,于是写了个BeanUtils类,来实现这样类似的操作。

 

using System;
using System.Reflection;
using System.Diagnostics;

namespace com.bairong.commons
{
    
/// <summary>
    
/// BeanUtils提供用于拷贝对象中的具体字段的值的方法
    
/// </summary>

    public class BeanUtils
    
{
        
/// <summary>
        
/// 把源对象里的各个字段的内容直接赋值给目标对象(只是字段复制,两个对象的字段名和类型都必须一致)
        
/// </summary>
        
/// <param name="dest">目标对象</param>
        
/// <param name="src">源对象</param>

        public static void CopyObject(ref object dest, object src)
        
{
            
if (null == src) throw new ArgumentNullException("src can't be null"); }
            
if (null == dest) throw new ArgumentNullException("dest can't be null"); }
            
            Type srcType 
= src.GetType();
            Type destType 
= dest.GetType();

            FieldInfo[] srcInfo 
= srcType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
            FieldInfo[] destInfo 
= destType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);

            
for (int i = 0; i < srcInfo.Length; i++)
            
{
                
string name = srcInfo[i].Name;
                
object val = srcInfo[i].GetValue(src);

                
for (int j = 0; j < destInfo.Length; j++)
                
{
                    
string targetName = destInfo[j].Name;

                    
if (name.Equals(targetName))
                    
{
                        destInfo[j].SetValue(dest, val);
                        
break;
                    }

                }

            }
            
        }



        
/// <summary>
        
/// 从一个对象里复制属性到另一个对象的同名属性
        
/// </summary>
        
/// <param name="dest">目标对象</param>
        
/// <param name="src">源对象</param>
        
/// <param name="fieldName">要复制的属性名字</param>

        public static void CopyProperty(ref object dest, object src, string fieldName)
        
{
            
if (null == src || null == dest || null == fieldName)
            
{
                
throw new ArgumentNullException("one argument is null!");
            }

            Type srcType 
= src.GetType();
            Type destType 
= dest.GetType();
            FieldInfo srcInfo 
= srcType.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
            FieldInfo destInfo 
= destType.GetField(fieldName,BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);           
            
object val = srcInfo.GetValue(src);
            destInfo.SetValue(dest, val);

        }



        
/// <summary>
        
/// 用于设置对象的属性值
        
/// </summary>
        
/// <param name="dest">目标对象</param>
        
/// <param name="fieldName">属性名字</param>
        
/// <param name="value">属性里要设置的值</param>

        public static void setProperty(ref object dest, string fieldName, object value)
        
{
            
if (null == dest || null == fieldName || null == value)
            
{
                
throw new ArgumentNullException("one argument is null!");
            }

            Type t 
= dest.GetType();
            FieldInfo f 
= t.GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
            f.SetValue(dest, value);
        }



        
/// <summary>
        
/// 反射打印出对象有的方法以及调用参数
        
/// </summary>
        
/// <param name="obj">传入的对象</param>

        public static void printMethod(ref object obj)
        
{
            Type t 
= obj.GetType();
            MethodInfo[] mif 
= t.GetMethods(BindingFlags.Public | BindingFlags.Instance);            
            
for (int i = 0; i < mif.Length; i++)
            
{
                Trace.WriteLine(
"方法名字:  {0} ", mif[i].Name);
                Trace.WriteLine(
"方法来自:  {0}", mif[i].Module.Name);
                ParameterInfo[] p 
= mif[i].GetParameters();
                
for (int j = 0; j < p.Length; j++)
                
{
                    Trace.WriteLine(
"参数名:  " + p[j].Name);
                    Trace.WriteLine(
"参数类型:  " + p[j].ParameterType.ToString());
                }

                Trace.WriteLine(
"******************************************");                
            }

        }


    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值