Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#在lambda中投射对象_C#_Dynamic_Lambda_Lazy Evaluation_Func - Fatal编程技术网

C#在lambda中投射对象

C#在lambda中投射对象,c#,dynamic,lambda,lazy-evaluation,func,C#,Dynamic,Lambda,Lazy Evaluation,Func,我目前正试图在业务逻辑中设置一个字段,在本例中,该字段是惰性的。 (是不是属性,需要设置字段) 我得到一个错误,懒惰不能转换为懒惰 如你所见: 类型的对象 'BusinessLogic.Lazy1[System.Object]' 无法转换为类型 'BusinessLogic.Lazy1[BusinessLogic.artikebll] 我使用这行代码来获取一个动态存储库 dynamic repository = Activator.CreateInstance(typeof(GenericRep

我目前正试图在业务逻辑中设置一个字段,在本例中,该字段是惰性的。 (是不是属性,需要设置字段) 我得到一个错误,懒惰不能转换为懒惰 如你所见:

类型的对象 'BusinessLogic.Lazy
1[System.Object]'
无法转换为类型
'BusinessLogic.Lazy
1[BusinessLogic.artikebll]

我使用这行代码来获取一个动态存储库

dynamic repository = Activator.CreateInstance(typeof(GenericRepository<>).MakeGenericType(typeArgs));
我尝试了很多不同的方法来解决它。 不知何故,我必须将
repository.GetDataById(id)
转换为它正在寻找的实体,在本例中,它是Artikelll(我可以通过
pInfo.PropertyType
获得)。 但是通过执行
(ArtikelBLL)repository.GetDataById(id)
,它将不会保持面向对象。
有人能帮我吗?

最简单的方法就是在lambda内部使用石膏:

fInfo.SetValue(obj, new Lazy<GenericBLL>(
    () => (ArtikelBLL) repository.GetDataById(id)));
fInfo.SetValue(obj,新版本)(
()=>(ArtikelBLL)repository.GetDataById(id));
毕竟,
Lazy
想要的就是这种类型

编辑:如果您试图动态执行此操作,我建议您编写一个通用方法,如下所示:

public Lazy<T> CreateLazyDataFetcher<T>(dynamic repository)
{
    return new Lazy<T>(() => (T) repository.GetDataById(id));
}
public-lazydatafetcher(动态存储库)
{
返回新的Lazy(()=>(T)repository.GetDataById(id));
}

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

我得到以下错误:类型为“BusinessLogic.Lazy
1[BusinessLogic.GenericBLL]”的对象无法转换为类型“BusinessLogic.Lazy
1[BusinessLogic.Artikelll]”。您正在尝试转换两种彼此不兼容的类型。一个是Lazy,另一个是Lazy。我编辑了我的问题:新的Lazy()错误,所以我使用fInfo.SetValue(obj,Lazy.From(()=>repository.GetDataById(id));这将要求一个Lazy,但是如何将repository.GetDataById(id)强制转换为Lazy中的pInfo.PropertyType类型?@vcsjones:自从我写下我的答案后,该问题已被编辑:(@user653830:如果您使用的是
Lazy.From
,则无论如何都需要相关类型进行类型推断。我将编辑我的答案。您可以提供一些信息以获得更好的答案:如果您编写
(ArtikelBLL)repository.GetDataById(id),为什么它不再是面向对象的
?字段的类型是什么?
GenericBLL
ArtikelBLL
之间的关系是什么(我猜后者是前者的子类,但您可以澄清)?GetDataById返回的对象是什么类型?ArtikelBLL确实是GenericBLL的一个子类。由于存储库是动态的,GetDataById应该返回存储库中T的实体(在本例中是ArtikelBLL)。它不是面向对象的,因为它在forloop中,存储库也需要返回其他子类(例如,我有LieferantenBLL),如果我将它强制转换为ArtikelBLL,它将返回错误。
public Lazy<T> CreateLazyDataFetcher<T>(dynamic repository)
{
    return new Lazy<T>(() => (T) repository.GetDataById(id));
}