gpt4 book ai didi

NHibernate:自定义属性访问器的 Get 和 Set 方法未被调用

转载 作者:行者123 更新时间:2023-12-04 06:41:05 25 4
gpt4 key购买 nike

我正在尝试将数据库字段(“LS_RECNUM”)可能的 NULL、'M' 和 'F' 值映射到具有 Gender 枚举类型的属性。

映射如下所示:

Map(x => x.Gender).Column("LS_GENDER").Access.Using<GenderPropertyAccessor>();

...和 ​​GenderPropertyAccessor 类如下所示:
using System;
using System.Collections;
using System.Reflection;
using Kctc;
using NHibernate.Engine;
using NHibernate.Properties;

public class GenderPropertyAccessor : IPropertyAccessor
{
#region Setter

private class GenderGetterSetter : IGetter, ISetter
{
PropertyInfo _property;
public GenderGetterSetter(PropertyInfo property)
{
if (property == null) throw new ArgumentNullException("property");
if (property.PropertyType != typeof(Gender)) throw new ArgumentException("property");
_property = property;
}

public void Set(object target, object value) //Convert string to enum
{
_property.SetValue(target, GetGenderFromString(value), null);
}

public object Get(object target) //Convert enum back to string
{
Gender gender = (Gender)_property.GetValue(target, null);
return SetGenderToString(gender);
}

/// <summary>
/// Interprets the supplied string as a gender.
/// </summary>
/// <param name="strGender">The gender as either 'F' or 'M'.</param>
/// <returns></returns>
private Gender GetGenderFromString(object strGender)
{
if (strGender == null) return Gender.Unknown;
switch (strGender.ToString().ToLower())
{
case "f":
return Gender.Female;
case "m":
return Gender.Male;
default:
return Gender.Unknown;
}
}

/// <summary>
/// Sets the supplied Gender to the appropriate 'M' or 'F' value.
/// </summary>
/// <param name="objGender">The gender.</param>
/// <returns></returns>
private string SetGenderToString(object objGender)
{
Gender gender = (Gender) objGender;
switch (gender)
{
case Gender.Female:
return "F";
case Gender.Male:
return "M";
default:
return null;
}
}

public MethodInfo Method
{
get { return null; }
}

public string PropertyName
{
get { return _property.Name; }
}

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

public Type ReturnType
{
get { return typeof(byte[]); }
}
}

#endregion

public IGetter GetGetter(Type theClass, string propertyName)
{
return new GenderGetterSetter(theClass.GetProperty(propertyName));
}

public ISetter GetSetter(Type theClass, string propertyName)
{
return new GenderGetterSetter(theClass.GetProperty(propertyName));
}

public bool CanAccessThroughReflectionOptimizer
{
get { return false; }
}
}

我不是特别熟悉反射,我完全不确定 Get 和 Set 方法是否已正确实现。

当我尝试这个时,我仍然收到错误“无法将 F 解析为性别”。我试过调试 GenderPropertyAccessor 类。映射文件中的相关行(如上所示)正确执行,GenderGetterSetter 类的构造函数也是如此,但从未调用 Get 和 Set 方法!!!

谁能告诉我我可能做错了什么?

最佳答案

我会为此使用 IUserType 的实现。这是一个 good simple example .在 NullSafeGet 和 NullSafeSet 方法中,您将分别将字符串更改为枚举和返回。为了让 NHibernate 检测更改,您的 Equals 实现是否正确也很重要。

映射属性以使用自定义用户类型很容易:

Map(x => x.Gender).Column("LS_GENDER").CustomType(typeof(MyUserType));

关于NHibernate:自定义属性访问器的 Get 和 Set 方法未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4224272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com