循环遍历一个对象并找到not null属性

我有2个相同对象的实例,o1和o2。 如果我正在做的事情

if (o1.property1 != null) o1.property1 = o2.property1 

对于对象中的所有属性。 循环遍历Object中所有属性的最有效方法是什么? 我看到人们使用PropertyInfo检查nulll属性,但似乎他们只能通过PropertyInfo集合但不链接属性的操作。

谢谢。

你可以用reflection做到这一点:

 public void CopyNonNullProperties(object source, object target) { // You could potentially relax this, eg making sure that the // target was a subtype of the source. if (source.GetType() != target.GetType()) { throw new ArgumentException("Objects must be of the same type"); } foreach (var prop in source.GetType() .GetProperties(BindingFlags.Instance | BindingFlags.Public) .Where(p => !p.GetIndexParameters().Any()) .Where(p => p.CanRead && p.CanWrite)) { var value = prop.GetValue(source, null); if (value != null) { prop.SetValue(target, value, null); } } } 

从你的例子来看,我认为你正在寻找这样的事情:

 static void CopyTo(T from, T to) { foreach (PropertyInfo property in typeof(T).GetProperties()) { if (!property.CanRead || !property.CanWrite || (property.GetIndexParameters().Length > 0)) continue; object value = property.GetValue(to, null); if (value != null) property.SetValue(to, property.GetValue(from, null), null); } } 

如果要多次使用,可以使用已编译的表达式来获得更好的性能:

 public static class Mapper { static Mapper() { var from = Expression.Parameter(typeof(T), "from"); var to = Expression.Parameter(typeof(T), "to"); var setExpressions = typeof(T) .GetProperties() .Where(property => property.CanRead && property.CanWrite && !property.GetIndexParameters().Any()) .Select(property => { var getExpression = Expression.Call(from, property.GetGetMethod()); var setExpression = Expression.Call(to, property.GetSetMethod(), getExpression); var equalExpression = Expression.Equal(Expression.Convert(getExpression, typeof(object)), Expression.Constant(null)); return Expression.IfThen(Expression.Not(equalExpression), setExpression); }); Map = Expression.Lambda>(Expression.Block(setExpressions), from, to).Compile(); } public static Action Map { get; private set; } } 

并像这样使用它:

 Mapper.Map(e1, e2);