C#将一个对象从B类分配给A类
我有两节课 A类:C#将一个对象从B类分配给A类,c#,C#,我有两节课 A类: public class A { prop string p1 { get; set; } prop string p2 { get; set; } prop string p3 { get; set; } } public class B { prop string p1 { get; set; } prop string p3 { get; set; } } B类: public class A { prop
public class A {
prop string p1 { get; set; }
prop string p2 { get; set; }
prop string p3 { get; set; }
}
public class B {
prop string p1 { get; set; }
prop string p3 { get; set; }
}
B类:
public class A {
prop string p1 { get; set; }
prop string p2 { get; set; }
prop string p3 { get; set; }
}
public class B {
prop string p1 { get; set; }
prop string p3 { get; set; }
}
现在假设我们有一个来自类B
的对象,我们想把它分配给来自类A
的对象
B b_obj = new B(){
p1 = "something",
p2 = "something else"
}
A a_obj = new A(){
p1 = b_obj.p1,
p3 = b_obj.p3,
}
我认为上述解决办法不是最好的办法
将b_obj
分配给类A
中的另一个对象的最佳实践是什么
提示:B类
中的所有属性在a类
始终可以实现隐式或显式强制转换运算符:
public class B
{
public static explicit operator A(B b)
{
return new A() {
p1 = b_obj.p1,
p3 = b_obj.p3,
}
}
//...
}
现在,您只需在需要AB
中的A
时编写:
var a = (A)b;
如果您无权访问A
或B
,则可以实施扩展方法:
public static A ToA(this B b)
{
return ...
}
其用途与此类似:
var a = b.ToA();
你可以使用automapper
然后你可以这样使用它:
AutoMapper.Mapper.CreateMap<A, B>();
var a = ...
var model = AutoMapper.Mapper.Map<B>(a);
AutoMapper.Mapper.CreateMap();
变量a=。。。
var模型=AutoMapper.Mapper.Map(a);
您可以使用(参见denisv的答案),它根据名称提供类之间的映射。然后,如果需要,可以自定义映射
您还可以编写一些扩展方法:
public static class Extensions
{
public A ToA(this B b)
{
return new A()
{
p1 = b_obj.p1,
p3 = b_obj.p3,
};
}
}
首先初始化B类并设置值。然后创建这样一个类:
public static void CopyPropertyValues(object source, object destination)
{
var destProperties = destination.GetType().GetProperties();
foreach (var sourceProperty in source.GetType().GetProperties())
{
foreach (var destProperty in destProperties)
{
if (destProperty.Name == sourceProperty.Name &&
destProperty.PropertyType.IsAssignableFrom(sourceProperty.PropertyType))
{
destProperty.SetValue(destination, sourceProperty.GetValue(
source, new object[] { }), new object[] { });
break;
}
}
}
}
并将A和B类作为参数传递给该类您可以在
B
中创建一个复制构造函数,该构造函数以A
为实例。但是,如果所有属性都相似,那么问题就出现了,为什么在同一时间有两个类all@TimSchmelter-最终将使用相同的“映射”逻辑这称为“对象到对象映射”。您可以手动执行此操作,也可以使用第三方解决方案(如Automapper)AutoMapper@Fabio:当然可以,但只有一次,并封装在B
中。虽然此答案是一个好答案,但您必须知道,这会使用反射并对性能产生影响。但这是最好的方法,你不必关心类中存在哪些字段,只要知道两个类的属性是相同的就足够了。只是向OP发出了性能影响的警告。我不是那个对你的帖子投反对票的人。我认为这是一个比Murad Garibzada更好的解决方案,因为它的表现。然后,您可以在cast操作符/扩展方法中使用此解决方案(请参阅比我更完整的@InBetween answer),以缩短代码库。我不喜欢它。它不是重构安全的。如果我将B.p1重构为B.q1,则属性名称不一致,我可能会遇到不明显的运行时故障或数据损坏,而不是编译时故障。为了确保重构过程中不会出现错误,您必须使用我提供的@bradgonesurfing基本语法编写一个单元测试。如果需要编译器帮助,可以对映射规则使用扩展语法: