2017-07-08 12 views
0

私はいくつかの入力構造を持っていますので、他の構造に変換する必要があります。ある構造から別の構造にフィールドをコピーする方法

struct Source1 
{ 
    public float x1; 
    public float x2; 
    public float x3; 
} 

struct Source2 
{ 
    public float x1; 
    public float x3; 
    public float x2; 
    public float x4; 
} 

struct Target 
{ 
    public float x1; 
    public float x2; 
    public float x3; 
} 

ソース構造に必須のフィールド(型と名前は何であるか)がありますが、そのフィールドのオフセットは不明です。また、ソース構造には、私が必要としないいくつかの余分なフィールドが含まれているかもしれません。

ソース構造からターゲット構造に必要なフィールドをコピーする方法を教えてください。私はできるだけ早くそれを行う必要があります。

Cでは、この種の問題の非常に簡単なレシピがあります。

#define COPY(x, y) \ 
{\ 
x.x1 = y.x1;\ 
x.x2 = y.x2;\ 
x.x3 = y.x3;\ 
} 

私は、フィールドの集合を得ることについて考え、その後のキーとしてその名を使用して、フィールドの値を取得するが、それは私に遅い解決策のように見えました。

答えて

2

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/how-to-implement-user-defined-conversions-between-structsにスクイズがあります。

これは、考慮すべき1つのアプローチであるimplicit operatorsの使用を詳述しています。

いくつかのサンプルコード:

using System; 

namespace Test 
{ 
    struct Source1 
    { 
     public float x1; 
     public float x2; 
     public float x3; 

     public static implicit operator Target(Source1 value) 
     { 
      return new Target() { x1 = value.x1, x2 = value.x2, x3 = value.x3 }; 
     } 
    } 

    struct Target 
    { 
     public float x1; 
     public float x2; 
     public float x3; 
    } 

    public class Program 
    { 
     static void Main(string[] args) 
     { 
      var source = new Source1() { x1 = 1, x2 = 2, x3 = 3 }; 
      Target target = source; 

      Console.WriteLine(target.x2); 

      Console.ReadLine(); 
     } 
    } 
} 

別の方法としては、AutoMapperを使用しています。 パフォーマンスは遅くなります。

+0

リンクが死亡し、死者のリンクは誰に仕えていません。 –

+0

@mjwills:ソース構造ごとに演算子を書く必要があるようですね。何百ものフィールドを持つ5つのソースがあるとしましょう。 – walruz

+0

最終行@walruzをチェックしてください。 – mjwills

0

この明示的なキャストを見

これは、元の構造体です。

public struct Source 
    { 
     public int X1; 
     public int X2; 
    } 

これが対象です。

public struct Target 
    { 
     public int Y1; 
     public int Y2; 
     public int Y3; 

     public static explicit operator Target(Source source) 
     { 
      return new Target 
      { 
       Y1 = source.X1, 
       Y2 = source.X2, 
       Y3 = 0 
      }; 
     } 

} 

変換相:

static void Main(string[] args) 
     { 
      var source = new Source {X1 = 1, X2 = 2}; 
      var target = (Target) source; 
      Console.WriteLine("Y1:{0} ,Y2{1} ,Y3:{2} ",target.Y1,target.Y2,target.Y3); 
      Console.Read(); 
     } 
関連する問題