如何将类对象转换为具有类似属性的其他类类型?

时间:2017-06-19 20:02:05

标签: c# .net casting

我正在尝试将c#中的类对象转换为其他类。由于我里面的字段类型,我无法显式转换。

假设A类有ID(int),Cobrand(字符串)和值(X类) B类也有ID(int),Cobrand(字符串)和值(X类)

如果只是将ClassA从ClassA转换为ClassB,我会做

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

DF['SUM']=DF.groupby(['ID', 'Shop'])['Sales'].transform('sum')
DF.loc[DF.Ind == 'F', 'SUM'] = 0
pd.concat([DF,DF.pivot(columns='Shop',values='SUM').
          add_suffix('_Sum').fillna(0)],axis=1).drop(['SUM'],axis=1)

Out[247]: 
   ID Shop  Sales Ind  A_Sum  B_Sum  C_Sum
0   1    A    554   T  554.0    0.0    0.0
1   2    B    678   F    0.0    0.0    0.0
2   3    A    546   T  546.0    0.0    0.0
3   4    A    896   T  896.0    0.0    0.0
4   5    B    426   F    0.0    0.0    0.0
5   6    B    391   T    0.0  391.0    0.0
6   7    C    998   F    0.0    0.0    0.0
7   8    C    565   T    0.0    0.0  565.0
8   9    C    128   T    0.0    0.0  128.0

因为我在这些类中有一个类(即使它们是相同的)我得到一个错误说"不能将类型ClassB.ClassX转换为ClassA.ClassX"。我该如何演员和转换?

1 个答案:

答案 0 :(得分:2)

这不是您遇到的投射问题。它是映射问题。对于这类问题,请使用AutoMapper(如果您使用数据库+ Web服务基础结构,这是常见的问题,并且是常用的练习):

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);
    }
}

<强> PS

实际上,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#cast更快。它只是跳过了许多语言保护检查。