C# 如何将LINQ与dynamic一起使用?仿制药?
我有一段代码:C# 如何将LINQ与dynamic一起使用?仿制药?,c#,linq,generics,dynamic,C#,Linq,Generics,Dynamic,我有一段代码: public void RepeaterListato_ItemDataBound(Object Sender, RepeaterItemEventArgs e) { if (listType == "pages") { var item = (Pagina)e.Item.DataItem; BuildFoto(e, item, IDCategoriaImmaginiPacchettoOfferta); } else
public void RepeaterListato_ItemDataBound(Object Sender, RepeaterItemEventArgs e)
{
if (listType == "pages")
{
var item = (Pagina)e.Item.DataItem;
BuildFoto(e, item, IDCategoriaImmaginiPacchettoOfferta);
}
else if (listType == "schede")
{
var item = (Scheda)e.Item.DataItem;
BuildFoto(e, item, IDCategoriaImmaginiPacchettoOfferta);
}
else if (listType == "news")
{
var item = (New)e.Item.DataItem;
BuildFoto(e, item, IDCategoriaImmaginiPacchettoOfferta);
}
}
private void BuildFoto(RepeaterItemEventArgs e, dynamic item, string id)
{
var immagine = item.Immagini.Cast<Allegato>().Where(p => p.Categoria == id).FirstOrDefault();
if (immagine != null)
{
// ...
}
}
public void RepeaterListato_ItemDataBound(对象发送方,repeaterItemEventTarget)
{
如果(列表类型=“页面”)
{
var item=(Pagina)e.item.DataItem;
BuildFoto(e,item,IDCategoriaImaginipacchettoOfferta);
}
else if(listType==“schede”)
{
var item=(Scheda)e.item.DataItem;
BuildFoto(e,item,IDCategoriaImaginipacchettoOfferta);
}
else if(列表类型==“新闻”)
{
var item=(新)e.item.DataItem;
BuildFoto(e,item,IDCategoriaImaginipacchettoOfferta);
}
}
私有void BuildFoto(RepeaterItemEventArgs e,动态项,字符串id)
{
var immagine=item.Immagini.Cast().Where(p=>p.Categoria==id.FirstOrDefault();
如果(immagine!=null)
{
// ...
}
}
因此,由于列表类型
(在页面加载时解析
)的类型,项
发生变化,因此我使用动态
。但是LINQ不适用于动态调度操作上的Cast
和Where
有解决办法吗?你认为我应该使用
泛型吗?最佳方法?由于您无法访问Pagina、Scheda和New的源代码,因此您没有很多选择
一是:
public void RepeaterListato_ItemDataBound(Object Sender, RepeaterItemEventArgs e)
{
IEnumerable<Immagini> immagini = null;
switch (listType)
{
case "pages":
immagini = ((Pagina)e.Item.DataItem).Immagini;
break;
case "schede":
immagini = ((Scheda)e.Item.DataItem).Immagini;
break;
case "news":
immagini = ((New)e.Item.DataItem).Immagini;
break;
}
if (immagini != null)
{
BuildFoto(e, immagini, IDCategoriaImmaginiPacchettoOfferta);
}
}
private void BuildFoto(RepeaterItemEventArgs e, IEnumerable<Immagini> immagini, string id)
{
var immagine = immagini.Cast<Allegato>().Where(p => p.Categoria == id).FirstOrDefault();
if (immagine != null)
{
// ...
}
}
public void RepeaterListato_ItemDataBound(对象发送方,repeaterItemEventTarget)
{
IEnumerable immagini=null;
开关(列表类型)
{
案例“页面”:
immagini=((Pagina)e.Item.DataItem);
打破
案例“schede”:
immagini=((Scheda)e.Item.DataItem);
打破
案例“新闻”:
immagini=((新)e.Item.DataItem);
打破
}
if(immagini!=null)
{
BuildFoto(e、immagini、IDCategoriaImmaginiPacchettoOfferta);
}
}
私有void BuildFoto(RepeaterItemEventArgs e、IEnumerable Imagini、字符串id)
{
var immagine=immagini.Cast().Where(p=>p.Categoria==id.FirstOrDefault();
如果(immagine!=null)
{
// ...
}
}
另一种选择是使用反射来获取Imagini集合实例
还有一个选项是创建包装类:
public interface IImmaginiContainer
{
IEnumerable<IImmagine> Immagini { get; }
}
public class NewWrapper : IImmaginiContainer
{
public NewWrapper(New source)
{
_source = source;
}
private readonly New _source;
public IEnumerable<IImmagine> Immagini => _source.Immagini;
}
// Create a similar class for Scheda and Pagina
private void BuildFoto(RepeaterItemEventArgs e, IImaginiContainer item, string id)
{
var immagine = item.Immagini.Cast<Allegato>().Where(p => p.Categoria == id).FirstOrDefault();
if (immagine != null)
{
// ...
}
}
公共接口IImmaginiContainer
{
IEnumerable Immagini{get;}
}
公共类NewWrapper:iImmaginicContainer
{
公共NewWrapper(新源)
{
_来源=来源;
}
私有只读新源;
public IEnumerable Immagini=>\u source.Immagini;
}
//为Scheda和Pagina创建一个类似的类
私有void BuildFoto(RepeaterItemEventArgs e,IImaginiContainer项,字符串id)
{
var immagine=item.Immagini.Cast().Where(p=>p.Categoria==id.FirstOrDefault();
如果(immagine!=null)
{
// ...
}
}
由于您无法访问Pagina、Scheda和New的源代码,因此您没有很多选择
一是:
public void RepeaterListato_ItemDataBound(Object Sender, RepeaterItemEventArgs e)
{
IEnumerable<Immagini> immagini = null;
switch (listType)
{
case "pages":
immagini = ((Pagina)e.Item.DataItem).Immagini;
break;
case "schede":
immagini = ((Scheda)e.Item.DataItem).Immagini;
break;
case "news":
immagini = ((New)e.Item.DataItem).Immagini;
break;
}
if (immagini != null)
{
BuildFoto(e, immagini, IDCategoriaImmaginiPacchettoOfferta);
}
}
private void BuildFoto(RepeaterItemEventArgs e, IEnumerable<Immagini> immagini, string id)
{
var immagine = immagini.Cast<Allegato>().Where(p => p.Categoria == id).FirstOrDefault();
if (immagine != null)
{
// ...
}
}
public void RepeaterListato_ItemDataBound(对象发送方,repeaterItemEventTarget)
{
IEnumerable immagini=null;
开关(列表类型)
{
案例“页面”:
immagini=((Pagina)e.Item.DataItem);
打破
案例“schede”:
immagini=((Scheda)e.Item.DataItem);
打破
案例“新闻”:
immagini=((新)e.Item.DataItem);
打破
}
if(immagini!=null)
{
BuildFoto(e、immagini、IDCategoriaImmaginiPacchettoOfferta);
}
}
私有void BuildFoto(RepeaterItemEventArgs e、IEnumerable Imagini、字符串id)
{
var immagine=immagini.Cast().Where(p=>p.Categoria==id.FirstOrDefault();
如果(immagine!=null)
{
// ...
}
}
另一种选择是使用反射来获取Imagini集合实例
还有一个选项是创建包装类:
public interface IImmaginiContainer
{
IEnumerable<IImmagine> Immagini { get; }
}
public class NewWrapper : IImmaginiContainer
{
public NewWrapper(New source)
{
_source = source;
}
private readonly New _source;
public IEnumerable<IImmagine> Immagini => _source.Immagini;
}
// Create a similar class for Scheda and Pagina
private void BuildFoto(RepeaterItemEventArgs e, IImaginiContainer item, string id)
{
var immagine = item.Immagini.Cast<Allegato>().Where(p => p.Categoria == id).FirstOrDefault();
if (immagine != null)
{
// ...
}
}
公共接口IImmaginiContainer
{
IEnumerable Immagini{get;}
}
公共类NewWrapper:iImmaginicContainer
{
公共NewWrapper(新源)
{
_来源=来源;
}
私有只读新源;
public IEnumerable Immagini=>\u source.Immagini;
}
//为Scheda和Pagina创建一个类似的类
私有void BuildFoto(RepeaterItemEventArgs e,IImaginiContainer项,字符串id)
{
var immagine=item.Immagini.Cast().Where(p=>p.Categoria==id.FirstOrDefault();
如果(immagine!=null)
{
// ...
}
}
您能否提供一个小的(完整的)控制台应用程序来显示问题,并与我们分享?这将使我们能够快速地重新处理问题,并为您提供一些解决问题的选项。Pagina、Scheda和New是否继承自一个以Imagini为属性的公共接口/基类?(如果为true,则item参数可以是该类型,并且不需要动态)它们都继承自名为BrObject
的类。但是在BrObject
中没有Immagini
as属性。@markzzz您能添加一个带有Immagini属性的接口并让它们实现它吗?@vc74:no。它们来自DLL,我无法编辑。你能提供一个小的(完整的)控制台应用程序来显示这个问题,并与我们分享吗?这将使我们能够快速地重新处理问题,并为您提供一些解决问题的选项。Pagina、Scheda和New是否继承自一个以Imagini为属性的公共接口/基类?(如果为true,则item参数可以是该类型,并且不需要动态)它们都继承自名为BrObject
的类。但是在BrObject
中没有Immagini
as属性。@markzzz您能添加一个带有Immagini属性的接口并让它们实现它吗?@vc74:no。它们来自DLL,我无法编辑。使用泛型?无法帮助?@markzzz如果这3个类不是从公共接口/基类继承的,您将无法使用泛型,如果它们继承了,您可以在中使用泛型约束BuildFoto@markzzz您还可以构建从具有Inmagini属性的公共祖先继承的包装器类。您可以给我最后一个例子