【问题标题】:How to convert a class object to an other class type with similar properties? [duplicate]如何将类对象转换为具有相似属性的其他类类型? [复制]
【发布时间】:2017-06-20 04:17:19
【问题描述】:

我正在尝试将 c# 中的一个类的对象转换为另一个类。由于我内部的字段类型,我无法显式转换。

假设 A 类具有 ID (int)、Cobrand (string) 和 Values (class X) B 类也有 ID(int)、Cobrand(字符串)和 Values(X 类)

如果它只是从 ClassA 转换为 ClassB 并带有类 X,我会这样做

 ClassA _classA = (ClassA)_classB 

 _classA.ID = _classB.ID;
 _classA.Cobrand = _classB.Cobrand;

由于我在这些类中有一个类(即使它们相同),我收到一条错误消息,提示“无法将类型 ClassB.ClassX 转换为 ClassA.ClassX”。我该如何投射和转换它?

【问题讨论】:

  • 了解您的课程是什么样的真的会有所帮助
  • 你能在这里定义类代码吗?

标签: c# .net casting


【解决方案1】:

这不是您遇到的投射问题。这是映射问题。对于这类问题使用 AutoMapper(如果你使用数据库+webservice 基础设施,这是常见的问题,并且是常用的做法):

using System;
using AutoMapper;

public class Foo
{
    public string A { get; set; }
    public int B { get; set; }  
}

public class Bar
{
    public string A { get; set; }
    public int B { get; set; }  
}

public class Program
{
    public static void Main()       
    {
        Mapper.CreateMap<Foo,Bar>();

        var foo = new Foo { A="test", B=100500 };

        var bar = Mapper.Map<Bar>(foo);

        Console.WriteLine("foo type is {0}", foo.GetType());
        Console.WriteLine("bar type is {0}", bar.GetType());

        Console.WriteLine("foo.A={0} foo.B={1}", foo.A, foo.B);
        Console.WriteLine("bar.A={0} bar.B={1}", bar.A, bar.B);
    }
}

附言

实际上,C# 中存在一些小技巧。通过对齐堆栈中的字段,可以将一个结构转换为另一个结构。这是如何完成的:

[StructLayout(LayoutKind.Explicit)]
public struct MyStructHack
{
    [FieldOffset(0)]
    public Foo a;

    [FieldOffset(0)]
    public Bar b;
}

public struct Foo { public int foo; }
public struct Bar { public int bar;}

var convert = new MyStructHack();
convert.a = new Foo {foo = 3};
var bar = convert.b;
Console.WriteLine(bar.bar);

请记住,您的结构中必须有相同的字节顺序。这种技术之所以常用,是因为它比进行 C# 强制转换更快。它只是跳过了许多语言保护检查。

【讨论】:

    猜你喜欢
    • 2020-12-17
    • 2012-01-16
    • 2019-10-06
    • 1970-01-01
    • 2017-12-17
    • 2019-02-07
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    相关资源
    最近更新 更多