我有一个对象DataParameterInfo(DPI),其中包含一些委托方法,用于将数据从DataReader移动到POCO或从POCO中获取值。
示例:
new DataParameterInfo<IBulletinPCN>
{
FieldName = "ChangeProcedure",
ParameterName = "@ChangeProcedure",
EntityName = "ChangeProcedure",
DataType = SqlDbType.NVarChar,
FieldType = FieldType.Other,
PopulateEntity = (dr, e) => e.ChangeProcedure = dr.IsDBNull(dr.GetOrdinal("ChangeProcedure")) ? null : dr.GetString(dr.GetOrdinal("ChangeProcedure")),
ReadEntity = e => e.ChangeProcedure
}
我喜欢在PopulateEntity委托中引用我的DPI的Fieldname属性,如下所示:
PopulateEntity = (dr, e) => e.ChangeProcedure = dr.IsDBNull(dr.GetOrdinal(FieldName)) ? null : dr.GetString(dr.GetOrdinal(FieldName)),
或者
PopulateEntity = (dr, e) => e.ChangeProcedure = dr.IsDBNull(dr.GetOrdinal(this.FieldName)) ? null : dr.GetString(dr.GetOrdinal(this.FieldName)),
当我尝试时,只有“this”指的是创建DPI的类,而不是DPI本身。
我可以在上面做我正在尝试的事情,如果是的话,怎么做?
答案 0 :(得分:1)
您不能引用具有该类的对象初始值设定项的类的另一个成员 - 这将导致循环引用。
您只需在初始化程序之后分配PopulateEntity
属性即可解决此问题。
答案 1 :(得分:1)
您可以通过更改该委托的调用方将字段名作为参数传递给您的委托:
例如:
PopulateEntity = (dr, e, fieldname) => e.ChangeProcedure = dr.IsDBNull(dr.GetOrdinal(fieldname)) ? null : dr.GetString(dr.GetOrdinal(fieldname))
并且在您执行该委托时,您说:
PopulateEntity(dr, e, this.fieldname);
答案 2 :(得分:0)
var x = new Foo { property = bar }
只是执行旧var x = new Foo(); x.property=bar;
的一种简便方法。对于这种情况,您只需要以旧式方式执行此操作,其中引用先前设置的属性值没有问题。