通过扩展方法和对象初始化器初始化另一类型的类的属性
本文关键字:初始化 类型 属性 方法 对象 扩展 | 更新日期: 2023-09-27 18:14:03
.
.
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
is
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; }
}
现在我想初始化DailyEntry
的Site
属性,就像在第一个代码片段中设置所有其他属性一样。
我找不到路?
除非我没理解问题,否则答案是:
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();
}
为什么不使用现有的函数?像这样:
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();
你所要做的就是像创建新的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()
}
}