[英]How can I use LINQ with dynamic? Generics?
我有這段代碼:
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)
{
// ...
}
}
因此,由於listType
的類型(在Page_Load
解析), item
發生了變化,因此我使用dynamic
。 但是LINQ不適用於Cast
和Where
上的動態調度操作。
有解決方法嗎? 我應該在您的意見中使用Generics
嗎? 最好的方法?
由於您無權訪問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)
{
// ...
}
}
另一個選擇是使用反射獲取immagini集合實例
還有另一個選擇是創建包裝器類:
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)
{
// ...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.