2011-03-17 165 views
2

目前我正在試圖設置一個字段,我需要在業務邏輯在這種情況下是懶惰內鑄造的對象。 (是不是財產,有必要設置字段) 我得到的錯誤是懶惰的,不能轉化爲懶惰 你可以看到:C#拉姆達

Object of type 'BusinessLogic.Lazy 1[System.Object]' cannot be converted to type 'BusinessLogic.Lazy 1[BusinessLogic.ArtikelBLL]

我用這條線來獲得一個動態庫。

dynamic repository = Activator.CreateInstance(typeof(GenericRepository<>).MakeGenericType(typeArgs)); 

然後我嘗試設置字段的值,但它失敗:

fInfo.SetValue(obj, Lazy.From(() => repository.GetDataById(id))); 

我試圖解決這個問題很多不同的方式。 不知怎的,我要投repository.GetDataById(id)它正在尋找的實體,在這種情況下是ArtikelBLL(我可以通過pInfo.PropertyType得到)。 但通過做(ArtikelBLL)repository.GetDataById(id)它不會保持面向對象。 任何人都可以幫助我嗎?

+0

一些信息,你可以提供更好的答案:爲什麼它不再是面向對象的,如果你寫的'(ArtikelBLL)repository.GetDataById(ID)'?該領域的類型是什麼? 'GenericBLL'和'ArtikelBLL'之間有什麼關係(我想後者是前者的一個子類,但你可以說明)? GetDataById返回的對象是什麼類型? – 2011-03-17 15:16:58

+0

ArtikelBLL確實是GenericBLL的一個子類。由於存儲庫是動態的,因此GetDataById應返回存儲庫中的T的實體(本例中爲ArtikelBLL)。它不是面向對象的,因爲它在forloop中,並且存儲庫需要返回其他子類(例如,我有LieferantenBLL),如果我將它轉換爲ArtikelBLL,則會返回錯誤。該字段的類型是懶惰。 – Stupidity 2011-03-17 15:30:27

回答

3

最簡單的方法是隻使用拉姆達內投:

fInfo.SetValue(obj, new Lazy<GenericBLL>(
    () => (ArtikelBLL) repository.GetDataById(id))); 

畢竟,那是Lazy<T>想要的類型。

編輯:如果你要動態地做到這一點,我建議你寫一個通用的方法是這樣的:

public Lazy<T> CreateLazyDataFetcher<T>(dynamic repository) 
{ 
    return new Lazy<T>(() => (T) repository.GetDataById(id)); 
} 

然後調用與反思這種方法。 (使用MethodInfo.MakeGenericMethod(...).Invoke(...)

+0

我得到以下錯誤:類型 對象「BusinessLogic.Lazy'1 [BusinessLogic.GenericBLL]」不能被轉換爲類型「BusinessLogic.Lazy'1 [BusinessLogic.ArtikelBLL]」。 – Stupidity 2011-03-17 15:13:59

+2

您正在嘗試投射兩種彼此不兼容的類型。一個是懶惰,另一個是懶惰。 – vcsjones 2011-03-17 15:18:46

+0

我編輯我的問題:新的懶惰()是錯誤的,所以我用fInfo.SetValue(OBJ,Lazy.From(()=> repository.GetDataById(ID)));這將要求一個懶惰,但我怎麼投入repository.GetDataById(ID)到Lazy中的pInfo.PropertyType類型? – Stupidity 2011-03-17 15:21:28