访问IEnumerable中包含的项的属性

时间:2014-05-30 15:01:45

标签: c# ienumerable

如果标题有误导性,请注意,如果您对我想说的内容有所了解,可以更正。 我有一个接受IEnumberable的函数。 IEnumerable是匿名类型。 我的功能在下面

public void AddToCollection_Short(IEnumerable query)
{
    List<object> list = new List<object>();
    foreach (var item in query)
    {
        var obj = new object();
        var date = item.Date.ToShortDateString();
        obj = new { date, item.Id, item.Subject };
        list.Add(obj);
    }
    AllQueries = list;
    OnPropertyChanged("AllQueries");
}

它不识别后缀,例如.Id,.Date,.Subject。请问我应采取什么方法来解决这个问题。是否有类似IEnumerable<Datetime Date, int Id, string Subject>查询

的内容

3 个答案:

答案 0 :(得分:3)

如果您知道类型,则可以投射对象

 foreach (var item in query.Cast<YourType>())

如果您不知道,那么您可以使用动态功能。您可以访问您的属性而不会出现编译时错误但是如果您尝试访问属性或方法不是存在,你将在运行时获得RuntimeBinderException

foreach (dynamic item in query)
{
    ...
}

答案 1 :(得分:1)

您可以使用(在C#4.0及更高版本中)dynamic关键字或将签名更新为AddToCollection_Short

public void AddToCollection_Short(IEnumerable query)
{
    List<object> list = new List<object>();
    foreach (dynamic item in query)
    {
        var obj = new object();
        var date = item.Date.ToShortDateString();
        obj = new { date, item.Id, item.Subject };
        list.Add(obj);
    }
    AllQueries = list;
    OnPropertyChanged("AllQueries");
}

答案 2 :(得分:1)

您应该能够为方法指定类型参数。

public void AddToCollection_Short<T>(IEnumerable<T> query) where T : IAmCommonInterface
{
    List<object> list = new List<object>();
    foreach (T item in query)
    {
        var obj = new object();
        var date = item.Date.ToShortDateString();
        obj = new { date, item.Id, item.Subject };
        list.Add(obj);
    }
    AllQueries = list;
    OnPropertyChanged("AllQueries");
}

并且您的类型参数的公共接口将具有您想要的所有属性。 这样做的好处是编译器会在您尝试在没有这些属性的Enumerable上使用它时告诉您。