2 using System.Collections.Generic;
9 public static List<PublicMemberInfo> GetPublicMemberInfos(
this Type type) {
10 const BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public;
12 var fieldInfos = type.GetFields(bindingFlags);
13 var propertyInfos = type.GetProperties(bindingFlags);
14 var memberInfos =
new List<PublicMemberInfo>(
15 fieldInfos.Length + propertyInfos.Length
18 for(
int i = 0; i < fieldInfos.Length; i++) {
22 for(
int i = 0; i < propertyInfos.Length; i++) {
23 var propertyInfo = propertyInfos[i];
24 if(propertyInfo.CanRead && propertyInfo.CanWrite && propertyInfo.GetIndexParameters().Length == 0) {
32 public static object PublicMemberClone(
this object obj) {
33 var clone = Activator.CreateInstance(obj.GetType());
34 CopyPublicMemberValues(obj, clone);
38 public static T PublicMemberClone<T>(
this object obj) where T :
new() {
40 CopyPublicMemberValues(obj, clone);
44 public static void CopyPublicMemberValues(
this object source,
object target) {
45 var memberInfos = source.GetType().GetPublicMemberInfos();
46 for(
int i = 0; i < memberInfos.Count; i++) {
47 var info = memberInfos[i];
48 info.SetValue(target, info.GetValue(source));