0

私は次のクラスを持っています:

public abstract class AbstractFoo
{        
    public virtual int Id { get; set; }
}

public class Foo : AbstractFoo
{
    public virtual string MyProp {get; set; }
}

私はそれを私の休止状態のマッピングファイルでそのように表現します:

<class name="AbstractFoo">
 <id name="Id">
   <generator class="native" />
 </id>
 <discriminator column="FooType" type="String" />

 <subclass name="Foo" discriminator-value="MoveFile">
     <property name="MyProp" />
 </subclass>
</class>

この時点から、正常に動作します。

私がやりたいのは、サブクラスのすべてのプロパティをメタデータとして保存することです。つまり、シリアル化してxmlとして保存したいので、それぞれに1つのテーブルがなくても、使用されない列がたくさんなくても、必要な数のサブクラスを持つことができます。

ありがとう。

4

1 に答える 1

0
<subclass name="Foo" discriminator-value="MoveFile">
  <property name="SerialisedProps" column="serialisedProps" access="Name.Space.FakeAccessor, Asse" />
</subclass>

class FakeAccessor : IPropertyAccessor, IGetter, ISetter
{
    public IGetter GetGetter(string name)
    {
        return this;
    }

    public ISetter GetSetter(string name)
    {
        return this;
    }

    public bool CanAccessThroughReflectionOptimizer { get { return false; } }

    public object Get(object target)
    {
        return Serialize(target);
    }
    object GetForInsert(object owner, IDictionary mergeMap, ISessionImplementor session)
    {
        return Get(owner);
    }

    public void Set(object target, object value)
    {
        // deserialize xml and set appropriate properties
    }

    Type ReturnType { get { return typeof(string); } }

    string PropertyName { get { return "SerialisedProps"; } }

    private string Serialize(object subclass)
    {
        // example implementation
        var type = subclass.GetType();
        var root = new XElement(type.Name);
        foreach (var prop in type.GetProperties())
        {
            root.Add(new XElement("property", new XAttribute("name", prop.name), new XAttribute("value", prop.GetValue(subclass, null) + ""));
        }
        return root.ToString();
    }
}
于 2012-12-11T19:54:53.880 に答える