c# – 在.Select()中将Func中的匿名作为参数返回
作者:互联网
为了方法的“后处理”,我想将一个额外的函数导入到一个方法中.
如何导入一个返回匿名类型的Func作为.Select扩展方法的参数?
表达方式如下:
p => new
{
ThumnailUrl = p.PicasaEntry.Media.Thumbnails[0].Attributes["url"],
ImageUrl = p.PhotoUri
}
并且需要在参数?????中使用并在.Select(?????)执行
private void BindControl<T, U>(string uri, DataBoundControl target, ?????)
where T : KindQuery, new()
where U : PicasaEntity, new()
{
PicasaFeed feed = CreateFeed<T>(uri);
albumList.DataSource = GetPicasaEntries<U>(feed).Select(?????);
albumList.DataBind();
}
更新:
最后我想把它称为:
string albumUri = PicasaQuery.CreatePicasaUri(PicasaUserID, PicasaAlbumID);
BindControls<AlbumQuery, Album>(albumUri, albumList, ?????);
string photoUri = PicasaQuery.CreatePicasaUri(PicasaUserID, PicasaAlbumID);
BindControls<PhotoQuery, Photo>(photoUri, slideShow, ?????);
其他方法如下:
private PicasaFeed CreateFeed<T>(string uri)
where T : KindQuery, new()
{
PicasaFeed feed = null;
try
{
PicasaService service = new PicasaService(PicasaApplicationName);
T query = new T();
query.BaseAddress = uri;
feed = service.Query(query);
}
catch (Exception ex)
{
//exception handling not shown
}
return feed;
}
private IEnumerable<T> GetPicasaEntries<T>(PicasaFeed feed)
where T : PicasaEntity, new()
{
if(feed == null){
return null;
}
IEnumerable<T> entries = null;
string cacheKey = feed.Id.ToString();
if(Cache.Get(cacheKey) == null)
{
entries = feed.Entries.Select(x => new T() { AtomEntry = x }).ToList();
Cache.Insert(cacheKey, entries,
null, Cache.NoAbsoluteExpiration, new TimeSpan(0,20,0));
}
return entries;
}
解决方法:
匿名类型实际上只是为本地使用而设计的.在强类型语言中,不能强烈键入的类型通常不会被鼓励用于一般用途……它们只是动态世界中c#s little dance的一部分.
你有两个选择.
创建一个强类型.
class Entry
{
public string ThumnailUrl { get; set; }
public string ImageUrl { get; set; }
}
然后使用:
p => new Entry
{
ThumnailUrl = p.PicasaEntry.Media.Thumbnails[0].Attributes["url"],
ImageUrl = p.PhotoUri
}
或者将其称为对象.然后使用反射来获取数据 – 我不建议这样做.
标签:c,linq,c-3-0,anonymous-types,generics 来源: https://codeday.me/bug/20190614/1237285.html