Имя класса карты NHibernate и разрешите его с помощью Reflection - PullRequest
0 голосов
/ 07 февраля 2011

У меня есть свойство класса, которое сопоставлено с другим классом, который не может быть сохранен в базе данных и не может быть сериализован;он реализует шаблон состояния.Итак, у меня есть что-то вроде этого:

public IState MyState { get; set; }

Где у меня есть два разных состояния

public class LockedState : IState ...

public class UnlockedState : IState ...

В базе данных мне нужно сохранить имя текущего состояния, которое может быть достигнуто с помощью,например:

string name = myState.GetType().Name;

Должен ли я написать собственный и подробный IUserState или есть что-нибудь вокруг?

1 Ответ

0 голосов
/ 07 февраля 2011

Для этого мне пришлось реализовать собственный IUserType следующим образом:

public sealed class StateMapper : IUserType

// get
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
string objectName = (string)NHibernateUtil.String.NullSafeGet(rs, names[0]);
Type stateType = Type.GetType(objectName, false, true);
if (stateType == null)
{
    return null;
}
// StateFacility is used by my code to create a new Type
return StateFacility.CreateState(stateType);
} 

// set
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
if (value == null)
{
    NHibernateUtil.String.NullSafeSet(cmd, null, index);
    return;
}
  NHibernateUtil.String.NullSafeSet(cmd, value, index);
}
...