2013-02-22 107 views
1

我在一個互操作場景中,因此我正在處理類似結構的結構和類在不同的程序集中使用 - 所以一個演員陣容是不夠的,必須手動場地,這是非常無聊和容易出錯。Linq查詢從對象B獲得具有相同名稱和類型的對象的屬性A

因此,我設計了一個功能,可以複製大量簡單的字段/屬性,而且我只處理困擾的字段/屬性。

當我這樣做屬性只,它工作正常。但我現在需要如何解決這個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'.

編輯:我看到了價值注入,但它像使用死星殺蚊子... [/編輯]

+1

他們會始終* *是在目標類型的原始類型和屬性字段?或者可能會有混合?另外,如果你遵循正常的.NET命名約定,並且使用'camelCase'作爲你的局部變量,你的代碼將更容易閱讀... – 2013-02-26 07:16:31

+0

@JonSkeet:_或者可能有混合?_在創建這個函數中,I涵蓋了這兩種情況。 _你遵循正常的.NET命名約定_我每天都在三個不同的平臺上編程,當我必須從頭開始創建代碼時,我很努力地傳達了最近的慣例。最後,嘗試創造的混亂讓我選擇了一個慣例 - – 2013-02-26 13:05:30

+0

@JonSkeet:(續)我可以不必停下來再調整:pascal對象。上面的代碼是我在工作中完成的真實代碼的摘錄。當我在SO上發佈時,我會嘗試傳達給.NET約定...... – 2013-02-26 13:12:03

回答

3

你的連接語句似乎已創造了2種不同的匿名類型,因爲一個有一個名爲FieldType財產和一個有一個名爲PropertyType屬性。 LINQ無法進行連接,除非這兩種類型按完全相同的順序具有完全相同的字段。有一篇關於這個found here的精彩文章。

在這種情況下,你需要做到這一點的您加入:

join PDest in PropDest 
     on new 
     { 
      Name = POrig.Name, 
      JoinType = POrig.FieldType 
     } equals new 
     { 
      Name = PDest.Name, 
      JoinType = PDest.PropertyType 
     } 
+0

它的工作機會很大。但我只有明天測試它的機會!尼斯。 – 2013-02-25 19:58:37

+0

這是否最終爲你工作? – IronMan84 2013-02-26 14:29:42

+1

工作很好! +1,接受。 SO只允許在2小時內獎賞賞金。 – 2013-02-26 15:34:19

相關問題