2011-03-17 127 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