当前位置: 首页 > 编程语言 > C#

C#中的inheritance:创建一个用超类实例的值初始化的实例分享

时间:2023-04-10 18:24:08 C#

C#学习教程:C#中的继承:创建一个用超类实例的值初始化的实例...我在C#中有一个名为Person的自定义类,它具有一些属性,如年龄、身高等。然后我创建了一个名为Employee的新类,它继承自Person,但我没有向Employee添加任何其他属性。所以它基本上只是一个人,除了它被称为员工。现在假设我有一个名为SomePerson的Person实例。我如何创建一个新的Employee实例,所有的值都继承自Person,并设置为SomePerson中的值。就像从Person转换为Employee..但我不必手动指定需要设置的每个属性..就像..EmployeeNewEmployee=(Employee)SomePerson;但当然你会收到错误“无法将人员转换为员工”等。如果你说涉及的对象有300个属性,那么AutoMapper是唯一可行的解??决方案吗?更新:Auto-Mapper似乎无法处理我的对象。EmployeeSomeEmployee=EmployeeRepository.GetEmployee(SomeEmployeeID);//使用从数据库中获取的Person填充ViewModel,准备好进行编辑..VMEmployeeEmployeeToEdit=Mapper.Map(SomeEmployee);//ViewModel基于应用了验证的Employee..[MetadataType(typeof(Employee_Validation))]publicclassVMEmployee:Employee{//这里什么都没有}其中“Employee”由LINQtoSQL自动生成。在这种情况下,AutoMapper是一个很好的解决方案。如果您不打算使用属性映射框架,并且您不愿意创建复制构造函数publicEmployee(Personperson)或隐式/显式转换,那么您要如何复制属性。其实你可以1.ReflectionpublicvoidMap(TSourcesource,TDestinationdestination){varprops=typeof(TSource).GetProperties(BindingFlags.Public|BindingFlags.Instance);vartype=typeof(TDestination);foreach(varpropinprops){objectvalue=prop.GetValue(source,null);varprop2=type.GetProperty(prop.Name);如果(prop2==null)继续;如果(prop.PropertyType!=prop2.PropertyType)继续;prop2.SetValue(目的地,价值,空);}}2.复制构造函数publicEmployee(Personperson){//复制属性}3.隐式/显式转换publicstaticimplicitoperatorEmployee(Personperson){//构建实??例并返回}4.AutoMapperMapper.Map(person);5.组合3/4:publicstaticimplicitoperatorEmployee(Personperson){returnMapper.Map(person);}关于隐式/显式转换运算符注意:我相信使用它们不会生成符合CLS的代码。正如@MitchWheat已经说过的,如果您有一个具有超过300个属性的对象,我会重新考虑该对象实际代表的内容。重构重构重构。您可以使用automaper无需任何配置即可实现此目的。这是一个例子:Employeeemployee=Mapper.Map(person);使用Person实例在Employee上创建一个构造函数。当然,您必须填写所有属性(也许Resharper可以提供帮助?)如果您的属性相对简单,反射可能是映射属性值的最快和最简单的解决方案。与流行的看法相反,反射确实没有那么糟糕;RickStrahl在这篇文章中驳斥了这个神话:http://www.west-wind.com/weblog/posts/351.aspx。为Employee创建以下构造函数:publicEmployee(Personperson){//clonepropertyvaluesforeach(varpropertyinperson.GetType().GetProperties().Where(property=>property.CanRead&&property.CanWrite)){属性.SetValue(this,property.GetValue(user,null),null);现在像这样简单地实例化一个Employee对象:EmployeeNewEmployee=newEmployee(SomePerson);“它们是复杂的LINQtoSQL模型类”——Aaron如果您有一个表映射到几个可能的类之一,您可以使用LINQtoSQL的继承层次结构。这意味着如果您对多种类型的概念实体使用同一个表,您可以让LINQtoSQL自动创建相应的类。每个类都可以有不同的属性,这些属性可以是表中列的子集。有一些限制。每个继承层次结构只能使用一个表,并且必须有一个鉴别器列告诉LINQtoSQL它应该使用哪个类。当你开始一份新工作时,是你是新人,谁是你的旧人?如果你的设计是基于那种场景,那么你的组织中的做法就很奇怪了。相反,一个人与雇主有雇佣关系。不要使用继承来建模角色;允许同一个人拥有代表他们与其他对象关系的角色。以上就是C#学习教程:InheritanceinC#:Createaninstanceinitializedwiththevalueofthesuperclassinstance分享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——本文整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: