C#将一个对象从B类分配给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

我有两节课

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 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,
                         }
     }

     //...
 }
现在,您只需在需要A
B
中的
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基本语法编写一个单元测试。如果需要编译器帮助,可以对映射规则使用扩展语法: