2

我目前正在尝试在业务逻辑中设置一个我需要的字段,在这种情况下是 Lazy。(是的,不是属性,需要设置字段)我得到了 Lazy 无法转换为 Lazy 的错误,如您所见:

'BusinessLogic.Lazy 1[System.Object]' cannot be converted to type 'BusinessLogic.Lazy1[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)不会保持面向对象。有人可以帮我吗?

4

1 回答 1

3

最简单的方法是在 lambda 中使用强制转换:

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(...)

于 2011-03-17T15:12:25.360 回答