我正在尝试将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"。我该如何演员和转换?
答案 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更快。它只是跳过了许多语言保护检查。