使用C#将属性值复制到另一个对象
这个问题在这里已经有了答案:
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。
只要你将属性保持在相同的类型和相同的命名约定中,所有的都应该工作。
例:
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