2017-06-19 80 views
0

我想將c#中的類的對象轉換爲其他類。由於我內部的字段類型,我無法顯式投射。如何將類對象轉換爲具有相似屬性的其他類類型?

假定一類具有ID(INT),Cobrand(字符串)和值(類X) 也B類具有ID(INT),Cobrand(字符串)和值(類X)

,如果它是從ClassA的只是轉換爲ClassB的與類X裏面,我要麼做

ClassA _classA = (ClassA)_classB 

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

因爲我有這些類中的一類(即使它們是相同的)時I g等錯誤說「不能將類型ClassB.ClassX轉換爲ClassA.ClassX」。我如何施放和轉換它?

+1

它會_really_幫助您知道您的類看起來像 – maccettura

+0

您可以在這裏定義類代碼嗎? – vipersassassin

回答

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#轉換更快。它只是跳過許多語言保護檢查。

相關問題