使用C#将属性值复制到另一个对象

这个问题在这里已经有了答案:

  • 深入克隆对象39个答案

  • public static void CopyPropertiesTo<T, TU>(this T source, TU dest)
    {
        var sourceProps = typeof (T).GetProperties().Where(x => x.CanRead).ToList();
        var destProps = typeof(TU).GetProperties()
                .Where(x => x.CanWrite)
                .ToList();
    
        foreach (var sourceProp in sourceProps)
        {
            if (destProps.Any(x => x.Name == sourceProp.Name))
            {
                var p = destProps.First(x => x.Name == sourceProp.Name);
                if(p.CanWrite) { // check if the property can be set or no.
                    p.SetValue(dest, sourceProp.GetValue(source, null), null);
                }
            }
    
        }
    
    }
    

    这是我用来在ASP.NET MVC中的模型之间复制成员的函数。 当您寻找适用于相同类型的代码时,此代码还将支持具有相同属性的其他类型。

    它使用反射,但以更干净的方式。 小心Convert.ChangeType :你可能不需要它; 你可以做一个类型检查而不是转换。

    public static TConvert ConvertTo<TConvert>(this object entity) where TConvert : new()
    {
        var convertProperties = TypeDescriptor.GetProperties(typeof(TConvert)).Cast<PropertyDescriptor>();
        var entityProperties = TypeDescriptor.GetProperties(entity).Cast<PropertyDescriptor>();
    
        var convert = new TConvert();
    
        foreach (var entityProperty in entityProperties)
        {
            var property = entityProperty;
            var convertProperty = convertProperties.FirstOrDefault(prop => prop.Name == property.Name);
            if (convertProperty != null)
            {
                convertProperty.SetValue(convert, Convert.ChangeType(entityProperty.GetValue(entity), convertProperty.PropertyType));
            }
        }
    
        return convert;
    }
    

    由于这是一种扩展方法,因此用法很简单:

    var result = original.ConvertTo<SomeOtherType>();
    

    如果我没有弄错需要什么,那么在两个现有实例 (即使不是相同类型) 之间轻松实现属性值复制的方法是使用Automapper。

  • 创建映射配置
  • 然后调用.Map(soure,target)
  • 只要你将属性保持在相同的类型和相同的命名约定中,所有的都应该工作。

    例:

    MapperConfiguration _configuration = new MapperConfiguration(cnf =>
                {
                    cnf.CreateMap<SourceType, TargetType>();
                });
    var mapper = new Mapper(_configuration);
    maper.DefaultContext.Mapper.Map(source, target)
    
    链接地址: http://www.djcxy.com/p/40757.html

    上一篇: Copy the property values to another object with C#

    下一篇: How to make a copy of an object in c#