如果两个对象具有相同的属性,那么一个值是否可以自动分配?
这是一个学术问题比什么都重要……我知道有更多实用的方法可以开发……
假设您有以下代码:
public MyObject1 AssignTest(MyObject1 obj1,MyObject2 obj2){
}
MyObject1和MyObject2具有完全相同的可用属性。 是否可以自动将MyObject1中指定的所有值分配给MyObject2? 而不是通过声明性地指定值(即MyObject1.Property1 = MyObject2.Property1等)
实现此目的的一种可能性(例如,为了创建自己的自动化程序或理解它基本上如何工作)将使用(如已建议的) reflection 。 代码可能如下所示:
// TODO: error handling // Test classes public class A { public string Name { get; set; } public int Count; } public class B { public string Name { get; set; } public int Count; } // copy routine public B CopyAToB(A a) { B b = new B(); // copy fields var typeOfA = a.GetType(); var typeOfB = b.GetType(); foreach (var fieldOfA in typeOfA.GetFields()) { var fieldOfB = typeOfB.GetField(fieldOfA.Name); fieldOfB.SetValue(b, fieldOfA.GetValue(a)); } // copy properties foreach (var propertyOfA in typeOfA.GetProperties()) { var propertyOfB = typeOfB.GetProperty(propertyOfA.Name); propertyOfB.SetValue(b, propertyOfA.GetValue(a)); } return b; }
该function可以这样使用:
var a = new A { Name = "a", Count = 1 }; var b = CopyAToB(a); Console.Out.WriteLine(string.Format("{0} - {1}", b.Name, b.Count));
输出是:
a - 1
请注意,reflection的使用需要付出代价 – 它会降低性能。 使用reflection,您可以访问私有和公共对象成员。 例如,这可以从Visual Studio中使用,以创建测试访问器对象,以便访问所有测试对象成员。
请查看现有的自动化程序(请参阅链接的其他答案)并使用它们而不是自己重新发明轮子 – 现有的库已针对速度进行了优化,经过全面测试并且使用起来非常舒适。 这样您就可以最大限度地减少代码中的错误。
映射库(如ValueInjector或AutoMapper)对于这种function非常有用。
使用AutoMapper,您可以使用类似的东西创建映射
Mapper.CreateMap();
它有许多默认约定,其中一个默认约定它将复制具有相同类型/名称的属性。
然后实际做这样的映射
var myObject2 = Mapper.Map(myObject1);
当然,你也可以通过reflection轻松完成这项工作,但是对于像这样的库,有人已经考虑添加各种方便的映射function,以及完成性能调整。 例如,AutoMapper使用IL生成来读取值而不是reflection,因此重复映射事物的速度要快得多(非常适合映射大量事物)
有很多工具可以做到这一点。 以服务堆栈中的“TranslateTo”例程为例。 他们有很好的自动映射( https://github.com/ServiceStack/ServiceStack/wiki/Auto-mapping )。
使用这个,你所要做的就是:
obj2 = obj1.TranslateTo();
简单而优雅!
如果您对其他一些类似主题的引用感兴趣:
AutoMapper是另一个很好的工具,如http://automapper.codeplex.com/
您可以使用以下内容从一个对象映射到另一个对象:
Mapper.CreateMap(); var myDTO = Mapper.Map(myClass);
- 在Batch方法中使用Select(x => x)的目的是什么?
- 我可以使用Ninject来实例化任何依赖的单件服务吗?
- 从C#中的DataTable获取单元格值
- Azure Web应用程序中的“无法创建SSL / TLS安全通道”
- Json.NET序列化私有成员而不是只读属性
- 用于更改链接的HtmlAgilityPack示例不起作用。 我该如何做到这一点?
- 如何在Windows应用程序中为当前登录的用户存储用户设置(用户名,密码)
- Bundle Minification在发布WebForms App时不起作用
- 在Windows资源管理器中打开文件夹结构时,DirectoryInfo.Delete(True)不会删除