2015-08-13 35 views
1

我有兩個對象(域和數據)在這種情況下具有相同的屬性(讓我們假設名稱)。我有Action<DomItem>,我想投到Action<DataItem>演員行動<T1>行動<T2>在c#中,其中T1和T2沒有關係

public class DomItem { 
    public string Name { get; set; } 
} 

public class DataItem { 
    public string Name { get; set; } 
} 

public class Program { 
    public Program() { 
     Action<DomItem> domAction = new Action<DomItem>(x=>x.Name = "Test"); 
     // Something Casted To Action<DataItem>(x=>x.Name = "Test"); 
    } 
} 

當然這只是一個基本的例子。這是設計,我不能使用通用接口。我不在乎DataItem可能沒有相同的屬性。我一直在調查表達式和其他一些解決方案,但我不知道如何創建Cast(或從方法中獲取「x => x.Name = ...」部分)。

任何幫助將非常感謝!

+2

爲什麼不只是使用AutoMapper? –

+0

請解釋如何oleksii。 – MightyMouseTheSecond

+0

基督徒,這只是一個例子。我希望DataItem在DomItem上定義的自身上運行該操作。 – MightyMouseTheSecond

回答

1

您不能直接或間接地投下Action<DomItem>Action<DataItem>,但你可以包裝有一個轉換器,轉換從DataItemDomItem輸入和運行在複製原有操作的操作:

public Action<DataItem> Convert(Action<DomItem> action) 
{ 
    return new Action<DataItem>(o => action(Map(o))); 
} 

public DomItem Map(DataItem dataItem) 
{ 
    return new DomItem{Name = dataItem.Name}; 
} 

一個明顯的缺點是,該操作將應用於原始對象的副本,而不是原始對象本身。我不知道到底是什麼動作,我不知道如何在沒有共同基礎類型的情況下「投射」動作。

+0

這不會工作,因爲該操作不是設置名稱,但我希望DataItem(轉到EF)執行特定的SQLQuery(因此操作)。我試圖簡化問題以防止大量的代碼。我真的需要知道如何將動作轉換爲動作而不是工作。謝謝你的幫助。 – MightyMouseTheSecond

+0

您無法將「動作」投射到「動作」。請注意,返回的操作不是設置名稱 - 它將傳遞給新'DomItem'的_original_操作與原始'DataItem'映射的屬性包裝在一起。 –

+0

謝謝您的輸入@ D-stanley。我會嘗試找到另一種溶劑。 – MightyMouseTheSecond

相關問題