实现我自己的 IUserType 时如何访问 property/mapping-attributes

How can I access property/mapping-attributes when implementing my own IUserType

我实现了自己的类型PaddedString,在映射中是这样使用的-xml:

<?xml version="1.0"
      encoding="utf-8"?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="MyAssembly"
                   namespace="MyNamespace">
  <class name="MyClass">
    <!-- id is omitted here -->
    <property name="MyProperty"
              length="300"
              type="TypeNamespace.PaddedString, TypeAssembly"/>
  </class>
</hibernate-mapping>

所以,我已经按照 this great code-project article 来实现我的 TrimmedString,我想我可以用它作为我的 PaddedString:

的指南
public sealed class PaddedString : IUserType,
                                   IEnhancedUserType
{
    // I am leaving out all the other methods, because NullSafeGet is the only one with the "real" logic
    public object NullSafeGet(IDataReader rs,
                              string[] names,
                              object owner)
    {
        var obj = NHibernateUtil.String.NullSafeGet(rs,
                                                    names[0]);

        var length = 300; // How do I read the attribute `length` of the mapping in here?

        if (obj == null)
        {
            return new string(' ',
                              length);
        }

        return obj.ToString()
                  .PadRight(length,
                            ' ');
    }
}

需要的部分很清楚:如何读取映射的属性length?或者您知道在 PaddedString 中注入长度的任何其他方法吗?

我已经通过合并 IParameterizedType 解决了这个问题,例如:

public sealed class PaddedString : IUserType,
                                   IEnhancedUserType,
                                   IParameterizedType
{
    private int Length { get; set; }

    public void SetParameterValues(IDictionary<string, string> parameters)
    {
        this.Length = int.Parse(parameters["length"]);
    }

    public object NullSafeGet(IDataReader rs,
                              string[] names,
                              object owner)
    {
        var obj = NHibernateUtil.String.NullSafeGet(rs,
                                                    names[0]);

        if (obj == null)
        {
            return new string(' ',
                              this.Length);
        }

        return obj.ToString()
                  .PadRight(this.Length,
                            ' ');
    }
}

然后我这样使用:

<?xml version="1.0"
      encoding="utf-8"?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="MyAssembly"
                   namespace="MyNamespace">
  <class name="MyClass">
    <!-- id is omitted here -->
    <property name="MyProperty">
        <type name="TypeNamespace.PaddedString, TypeAssembly">
            <param name="length">300</length>
        </type>
    </property>
  </class>
</hibernate-mapping>