主要是为了应付不同类之间成员的相互赋值。节省代码量。
namespace ConsoleApplication3 { public interface interTest { } public class Test : interTest { public string Name; public int Id; public int TestId; public int Property { get; set; } } public class TestClone { public string Name; public int Id; public int CloneId; public int Property { get; set; } } public static class Logic { public static MemberTypes AllowType = MemberTypes.Field | MemberTypes.Property; public static void CloneField<T, T1>(this T instance, T1 copyTo) where T : class ,interTest, new() { var instanceType = instance.GetType(); var copyType = copyTo.GetType(); var copyField = copyType.GetFields(); instanceType.GetFields().All(field => { var temp = copyField.FirstOrDefault(o => o.Name.Equals(field.Name, StringComparison.CurrentCulture) && o.FieldType == field.FieldType); if (temp == null) return true; temp.SetValue(copyTo, field.GetValue(instance)); return true; }); } public static void CloneProperty<T, T1>(this T instance, T1 copyTo) where T : class ,interTest, new() { var instanceType = instance.GetType(); var copyType = copyTo.GetType(); var copyProperties = copyType.GetProperties(); instanceType.GetProperties().All(property => { var temp = copyProperties.FirstOrDefault(o => o.Name.Equals(property.Name, StringComparison.CurrentCulture) && o.PropertyType == property.PropertyType); if (temp == null) return true; temp.SetValue(copyTo, property.GetValue(instance, null), null); return true; }); } } }
调用
class Program { static void Main(string[] args) { Test t = new Test(); t.Id = 1; t.Name = "shikyoh"; t.TestId = 12; t.Property = 600; TestClone tc = new TestClone(); t.CloneField(tc); t.CloneProperty(tc); Console.WriteLine("tc.Name:" + tc.Name); Console.WriteLine("tc.Id:" + tc.Id); Console.WriteLine("tc.Property:" + tc.Property); Console.WriteLine("tc.CloneId:" + tc.CloneId); } }
注意 类的名称必须相同,并且类型必须相同。