1

私は相互運用シナリオに取り組んでおり、そのため、さまざまなアセンブリで構造のように使用される構造とクラスを扱っています。そのため、キャストは十分ではなく、フィールドごとに手動で行う必要があり、非常に退屈でエラーが発生しやすくなっています。 .

そこで、大量の単純なフィールド/プロパティをコピーする関数を考案し、問題のあるものだけを処理しました。

これをプロパティに対してのみ行うと、問題なく動作します。しかし、このクエリを修正LiNQして、ソース オブジェクトからフィールドのリストを取得し、それらをターゲット オブジェクトのプロパティと結合できるようにする必要があります。

以下のコード:

    var TypeOrig = pSource.GetType();
    var TypeDest = pTarget.GetType();
    var TypeString = typeof(System.String);

    var PropOrig = TipoOrig.GetFields(); // if it is GetProperties instead 
                                         // of GetFields works OK
    var PropDest = TipoDest.GetProperties();

    var QryPropVT =
      from
        POrig in PropOrig
      join PDest in PropDest
        on new
        {
            POrig.Name,
            POrig.FieldType
        } equals new
        {
            PDest.Name,
            PDest.PropertyType
        }
      where POrig.PropertyType.IsValueType || (POrig.PropertyType.Equals(TipoString))
      select new
      {
          PropO = POrig,
          PropD = PDest
      };

Visual C# error: Error 2 The type of one of the expressions in the join clause is incorrect. Type inference failed in the call to 'Join'.

編集:バリューインジェクターを見ましたが、デススターを使って蚊を殺すようなものです... [/編集]

4

2 に答える 2

3

FieldType1 つには というプロパティがあり、もう 1 つにはというプロパティがあるため、結合ステートメントは 2 つの異なる匿名型を作成しているようPropertyTypeです。両方の型がまったく同じフィールドをまったく同じ順序で持っていない限り、LINQ は結合を実行できません。これに関する素晴らしい記事がここにあります。

その場合、参加のためにこれを行う必要があります:

join PDest in PropDest
        on new
        {
            Name = POrig.Name,
            JoinType = POrig.FieldType
        } equals new
        {
            Name = PDest.Name,
            JoinType = PDest.PropertyType
        }
于 2013-02-25T18:57:03.757 に答える
1

あなたは AutoMapper の後だと思います。http://automapper.codeplex.com/または Value Injector http://valueinjecter.codeplex.com/

値インジェクターの例:

myObject.InjectFrom(anyOtherObject);

//inject from multiple sources
a.InjectFrom(b,c,d,e);

//inject using your own injection
a.InjectFrom<MyInjection>(b);
于 2013-02-22T23:33:53.030 に答える