【问题标题】:Refer to an object being initialized within the initialization?是指在初始化中被初始化的对象吗?
【发布时间】:2012-05-14 01:14:37
【问题描述】:

我有一个对象 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 本身。

我可以在上面做我正在尝试的事情吗?如果可以,怎么做?

【问题讨论】:

    标签: c# syntax initialization


    【解决方案1】:

    您可以通过更改委托的调用者将字段名称作为参数传递给委托:

    例如:

    PopulateEntity = (dr, e, fieldname) => e.ChangeProcedure = dr.IsDBNull(dr.GetOrdinal(fieldname)) ? null : dr.GetString(dr.GetOrdinal(fieldname))
    

    在您执行该委托时,您会说:

    PopulateEntity(dr, e, this.fieldname);
    

    【讨论】:

    • facepalm 我不知道我是怎么错过这种可能性的。谢谢!
    【解决方案2】:

    您不能在该类的对象初始化器中引用该类的另一个成员 - 这会导致循环引用。

    您可以通过简单地在初始化器之后分配PopulateEntity 属性 来解决此问题。

    【讨论】:

    • 嗯。是的,我可以看到。 DPI 是作为静态属性中列表的一部分创建的,但我可以对其进行重新设计,以便该属性由一个方法填充,然后在之后遍历该列表......但这将使访问实体属性变得棘手,除非我编写每个一个手动的,我正在努力减少总体上的手动操作......不过,它是一个很好的领先优势。
    【解决方案3】:

    var x = new Foo { property = bar } 只是旧的var x = new Foo(); x.property=bar; 的一种简便方法。对于这种情况,您只需要使用老式的方法来引用以前设置的属性值就没有问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2018-02-10
      • 1970-01-01
      相关资源
      最近更新 更多