public void Copy(object source, object destination, params string[] excludedMembers) { Guard.IsNotNull(source, "source"); Guard.IsNotNull(destination, "destination"); bool hasExcludedMembers = ((excludedMembers != null) && (excludedMembers.Length > 0)); Type sourceType = source.GetType(); IEnumerable <FieldInfo> fields = fieldCache.GetFields(sourceType); if (hasExcludedMembers) { fields = fields.Where(field => !excludedMembers.Any(name => field.Name.IsCaseInsensitiveEqual(name))); } foreach (FieldInfo field in fields) { field.SetValue(destination, field.GetValue(source)); } IEnumerable <PropertyInfo> properties = propertyCache.GetProperties(sourceType); if (hasExcludedMembers) { properties = properties.Where(property => !excludedMembers.Any(name => property.Name.IsCaseInsensitiveEqual(name))); } foreach (PropertyInfo property in properties) { if (property.GetIndexParameters().Length == 0) { property.SetValue(destination, property.GetValue(source, null), null); } } }