2011-03-31 45 views
3

我在不同的命名空間中有兩個類似的[所有屬性都是相同的]結構。在不同名稱空間內轉換同一結構之間的值。 C#

現在,當我嘗試複製這些結構的對象之間的值時,我得到錯誤。

我該如何才能在不同名稱空間中駐留的兩個類似結構的對象之間複製值?

在此先感謝。

問候,

約翰

+0

到目前爲止你有什麼? – 2011-03-31 12:37:18

+1

你能舉一個你想做什麼的例子,爲什麼它不工作?這不是很多信息... – 2011-03-31 12:37:23

回答

5

您不能自動使用框架的內置轉換。

短名稱(即命名空間內)是完全不相關的在這裏 - 至於CLR而言,A.B.C.SomeTypeA.B.C1.SomeType是爲X.Y.FooA.B.Bar不同。

您應該編寫自己的轉換例程,或者(最好)避免首先使用兩種不同的類型,如果它們執行相同的操作。或者,您可以使用基於反射的方法來執行轉換......但仍然沒有讓運行時來做到這一點。

5

使用AutoMapper

Mapper.CreateMap<My.NS1.Structure, My.NS2.Structure>(); 
My.NS1.Structure struct1; 
My.NS2.Structure struct2 = (My.NS2.Structure) Mapper.Map(struct1); 
0

從問題中的描述,它聽起來像你想在你的類型之間有implicit conversion。雖然你可能能夠做到這一點,除了其他建議,你可能會得到更好的使用像

  • 其他方法有一個類做轉換爲你
  • 添加構造每個班從類型B的產生A型的,並且反之亦然
  • 添加擴展方法的每個充當廠用於製造其他
0

,因爲所有的屬性是相同的,則可以如定義一個接口,描述你的結構並在你的結構中實現這個接口。 然後將您的結構強制轉換爲複製值的界面。

問候, Ø

0

您可以使用一個聯盟:

public struct A 
{ 
    int x, y; 
    double a, b; 

    public A(int x, int y, double a, double b) 
    { 
     this.x = x; 
     this.y = y; 
     this.a = a; 
     this.b = b; 
    } 
} 
public struct B 
{ 
    int x, y; 
    double a, b; 
} 

[StructLayout(LayoutKind.Explicit)] 
public class Union 
{ 
    [FieldOffset(0)] 
    public A a; 
    [FieldOffset(0)] 
    public B b; 

    public Union(A a) 
    { 
     this.b = default(B); 
     this.a = a;    
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     A a = new A(5, 10, 0.25, 0.75); 
     Union union = new Union(a); 
     B b = union.b; //contains 5,10,0.25,0.75 
    } 
} 
4

我從通過WCF外部提供商消費多個Web服務時遇到了同樣的問題。有一個非常大的嵌套對象樹,這對於在類之間進行映射是很痛苦的,尤其是因爲這個樹有幾個將抽象基類作爲成員的實例。由於這些類都是使用傳輸到Web服務所需的XML序列化屬性來定義的,因此我選擇使用序列化程序爲我進行轉換。

TOutput ConvertEquivalentTypes<TInput, TOutput>(TInput structure) 
     where TInput : class 
     where TOutput : class 
    { 
     TOutput result = null; 

     using (Stream data = new MemoryStream()) 
     { 
      new XmlSerializer(typeof(TInput)).Serialize(data, structure); 
      data.Seek(0, SeekOrigin.Begin); 
      result = (TOutput)new XmlSerializer(typeof(TOutput)).Deserialize(data); 
     } 

     return result; 
    } 
2

替代那個查克蓋伊的答案 - 您可以使用反射來獲取和設置值。不知道性能有什麼好處/不利因素。

public static class EquivelantStructureConversion<TInput, TOutput> 
    where TInput : class 
    where TOutput : new() 
{ 
    public static TOutput Convert(TInput input) 
    { 
     var output = new TOutput(); 

     foreach (var inputProperty in input.GetType().GetProperties()) 
     { 
      var outputProperty = output.GetType().GetProperty(inputProperty.Name); 
      if (outputProperty != null) 
      { 
       var inputValue = inputProperty.GetValue(input, null); 
       outputProperty.SetValue(output, inputValue, null); 
      } 
     } 

     return output; 
    } 
} 

如果輸出類型的屬性不存在,上面的例子不會引發異常,但您可以輕鬆地添加它。

相關問題