【问题标题】:C# casting an object within lambdaC# 在 lambda 中转换对象
【发布时间】:2011-03-17 15:09:17
【问题描述】:

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

对象类型 'BusinessLogic.Lazy1[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),它不会保持面向对象。 有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您可以提供一些信息以获得更好的答案:如果您写了(ArtikelBLL)repository.GetDataById(id),为什么它不再是面向对象的?字段的类型是什么? GenericBLLArtikelBLL 之间有什么关系(我猜后者是前者的子类,但你可以澄清一下)? GetDataById 返回的对象是什么类型?
  • ArtikelBLL 确实是 GenericBLL 的子类。因为存储库是动态的,GetDataById 应该返回 Repository 中的 T 实体(在本例中为 ArtikelBLL)。它不是面向对象的,因为它位于 forloop 中,并且存储库也需要返回其他子类(例如我有 LieferantenBLL),如果我将其转换为 ArtikelBLL,它将返回错误。该字段的类型是 Lazy

标签: c# dynamic lambda lazy-evaluation func


【解决方案1】:

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

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

毕竟,这正是Lazy&lt;T&gt; 想要的类型。

编辑:如果您尝试动态执行此操作,我建议您编写这样的通用方法:

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

然后使用反射调用该方法。 (使用MethodInfo.MakeGenericMethod(...).Invoke(...)

【讨论】:

  • 我收到以下错误:“BusinessLogic.Lazy1[BusinessLogic.GenericBLL]' cannot be converted to type 'BusinessLogic.Lazy1[BusinessLogic.ArtikelBLL]”类型的对象。
  • 您正在尝试转换两种彼此不兼容的类型。一个是 Lazy,另一个是 Lazy
  • 我编辑了我的问题:新的 Lazy() 错误,所以我使用 fInfo.SetValue(obj, Lazy.From(() => repository.GetDataById(id)));这将要求一个 Lazy,但我如何将 repository.GetDataById(id) 转换为 Lazy 中的 pInfo.PropertyType 类型?
  • @vcsjones:自从我写下我的答案后,这个问题就被编辑了:(
  • @user653830:如果您使用的是Lazy.From,那么无论如何都需要相关类型来进行类型推断。我将编辑我的答案。
猜你喜欢
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多