2011-03-31 44 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; 
    } 
} 

如果输出类型的属性不存在,上面的例子不会引发异常,但您可以轻松地添加它。

相关问题