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属性的公共祖先继承的包装器类。您可以给我最后一个例子