инициализировать свойство класса другого типа с помощью метода расширения и инициализаторов объекта - PullRequest
0 голосов
/ 08 ноября 2011
.
.
List<DailyEntry> entries = null;
using (SqlCeDataReader rdr = cmd.ExecuteReader())
{
    entries = rdr.Select(r => new DailyEntry
    {
        ID = int.Parse(r["Col_ID"].ToString()),
        Amount = decimal.Parse(r["Col_Amount"].ToString()),
        Date = DateTime.Parse(r["Col_Date"].ToString()),
        Remarks = r["Col_Remarks"].ToString()
    }).ToList();
}
.
.

метод расширения select равен

 public static IEnumerable<T> Select<T>(this SqlCeDataReader reader,
                                        Func<SqlCeDataReader, T> projection)
 {
     while (reader.Read())
     {
         yield return projection(reader);
     }
 }

, где DailyEntry класс равен

class DailyEntry
{
    public int ID { get; set; }
    public DateTime Date { get;set; }
    public Site Site { get; set; }
    public decimal Amount { get; set; }
    public string Remarks { get; set; }
}

DailyEntry класс имеет еще одно свойство типа Site

class Site
{
    public int SiteID { get; set; }
    public string SiteName { get; set; }
}

Теперь я хочу инициализировать свойство Site DailyEntry, как все остальные свойства задаются в первом фрагменте кода ..

Я не нахожу способ?

Ответы [ 3 ]

1 голос
/ 08 ноября 2011

Все, что вам нужно сделать, это создать его встроенным так же, как вы создаете новый экземпляр DailyEntry:

rdr.Select(r => new DailyEntry
{
    ID = int.Parse(r["Col_ID"].ToString()),
    Amount = decimal.Parse(r["Col_Amount"].ToString()),
    Date = DateTime.Parse(r["Col_Date"].ToString()),
    Remarks = r["Col_Remarks"].ToString(),
    Site = new Site 
           {
               SiteID = int.Parse(r["Site_ID"].ToString()),
               SiteName = r["Site_Name"].ToString()
           }
}
1 голос
/ 08 ноября 2011

Если я не понял вопроса, ответ:

List<DailyEntry> entries = null;
using (SqlCeDataReader rdr = cmd.ExecuteReader())
{
    entries = rdr.Select(r => new DailyEntry
    {
        ID = int.Parse(r["Col_ID"].ToString()),
        Amount = decimal.Parse(r["Col_Amount"].ToString()),
        Date = DateTime.Parse(r["Col_Date"].ToString()),
        Remarks = r["Col_Remarks"].ToString(),
        Site = new Site 
        {
            SiteID = int.Parse(r["Site_ID"].ToString()),
            SiteName = r["name"].ToString()
        }
    }).ToList();
}
1 голос
/ 08 ноября 2011

Почему бы не использовать существующий функционал?Как то так:

entries = rdr.Select(r => new DailyEntry
    {
        ID = int.Parse(r["Col_ID"].ToString()),
        Amount = decimal.Parse(r["Col_Amount"].ToString()),
        Date = DateTime.Parse(r["Col_Date"].ToString()),
        Remarks = r["Col_Remarks"].ToString(),
        Site = new Site {SideID = r["..."], SiteName = r["..."]}
    }).ToList();
...