我有以下功能
public List<Object> GetEventsForAdmin()
{
using (var dbEntities = new CapeledEntities())
{
return (from e in dbEntities.Events
join lnk in dbEntities.linkEventCategories on e.EventId equals lnk.EventId
join cat in dbEntities.Categories on lnk.CategoryId equals cat.CategoryId
orderby e.StartDateTime descending
select new {
e.EventId,
EventTitle = e.Title,
e.StartDateTime,
e.Description,
CatTitle = cat.Title
}
).ToList<Object>();
}
}
我正在使用
var eventHelper = new BusinessLogic.DatabaseAccess.Helpers.BLEvents();
foreach (var myEvent in eventHelper.GetEventsForAdmin())
{
txtTitle.text = myEvent.CatTitle;
txtDescription.text = myEvent.description;
}
但是找不到myEvent.CatTitle和myEvent.description argh
}
答案 0 :(得分:2)
更改
foreach (var myEvent in eventHelper.GetEventsForAdmin())
到
foreach (dynamic myEvent in eventHelper.GetEventsForAdmin())
这应该允许您访问已被强制转换为对象的匿名类型的成员。
答案 1 :(得分:2)
我建议您创建一个简单的dynamic
或struct
,而不是使用class
:
class Event
{
public int EventId;
public string EventTitle;
public DateTime StartDateTime;
public string Description;
public string CatTitle;
}
现在,您可以创建一个明确定义的类型,而不是在您的LINQ中执行select new
,这将为您提供编码优势以及性能提升,因为不会涉及装箱/拆箱。
您的LINQ将是:
public List<Event> GetEventsForAdmin()
{
using (var dbEntities = new CapeledEntities())
{
return (from e in dbEntities.Events
join lnk in dbEntities.linkEventCategories on e.EventId equals lnk.EventId
join cat in dbEntities.Categories on lnk.CategoryId equals cat.CategoryId
orderby e.StartDateTime descending
select new Event() {
.EventId = e.EventId,
.EventTitle = e.Title,
.StartDateTime = e.StartDateTime,
.Description = e.Description,
.CatTitle = cat.Title
}
).ToList();
}
}
答案 2 :(得分:1)
据我所知,似乎有三种可能的方式。
1)使用Dynamic
(需要.Net 4.0或更高版本)
foreach (dynamic myEvent in eventHelper.GetEventsForAdmin())
2)创建自己的类型(可能是一个类)而不是anonymous type
3)第三个是使用CastByExample
的棘手问题here
object obj = eventHelper.GetEventsForAdmin();
var events = CastByExample(obj, new[] {
new { EventId = 0,
EventTitle = "",
StartDateTime = DateTime.MinValue,
Description = "",
CatTitle = ""
}
}.ToList());
foreach (var item in events)
{
Console.WriteLine(item.EventId);
}
private static T CastByExample<T>(object obj, T example)
{
return (T)obj;
}
4)正如@KingKing在评论中提到的,我错过了Reflection
你也可以通过反思做到这一点,但这不是一个好主意。
据说尽可能多的方法,我会建议方法2,这是解决这个问题的理想方法。