C# 使用nhibernate为泛型选项类创建IUserType

C# 使用nhibernate为泛型选项类创建IUserType,c#,nhibernate,generics,iusertype,C#,Nhibernate,Generics,Iusertype,我正在寻找一种为选项类型类创建IUserType的方法。以下是选项类型类别代码: public static class Option { public static Option<T> Some<T>(T value) { return new Option<T>(value); } public static Option<T> None<T>() { re

我正在寻找一种为选项类型类创建IUserType的方法。以下是选项类型类别代码:

public static class Option 
{
    public static Option<T> Some<T>(T value)
    {
        return new Option<T>(value);
    }

    public static Option<T> None<T>()
    {
        return new Option<T>();
    }
}
public class Option<T>
{
    public Option(T value)
    {
        _value = value;
        _isSome = true;
    }

    public Option()
    {
        _isSome = false;
    }

    T _value;
    bool _isSome;

    public bool IsSome
    {
        get { return _isSome; }
    }

    public bool IsNone
    {
        get { return !_isSome; }
    }

    public T Value
    {
        get { return _value; }
    }

    public T ValueOrDefault(T value)
    {
        if (IsSome)
            return Value;

        return value;
    }

    public override bool Equals(object obj)
    {
        var temp = obj as Option<T>;
        if (temp == null)
            return false;

        if (this.IsNone && temp.IsNone)
            return true;

        if (this.IsSome && temp.IsSome)
        {
            var item1 = this.Value;
            var item2 = temp.Value;
            return object.Equals(item1, item2);
        }

        return false;
    }

    public override int GetHashCode()
    {
        if (this.IsNone)
            return base.GetHashCode() + 23;

        return base.GetHashCode() + this.Value.GetHashCode() + 23;
    }
}
公共静态类选项
{
公共静态选项部分(T值)
{
返回新选项(值);
}
公共静态选项None()
{
返回新选项();
}
}
公共类选项
{
公共期权(T值)
{
_价值=价值;
_isSome=真;
}
公共选择权()
{
_isSome=假;
}
T_值;
布尔是一些人;
公共场所令人讨厌
{
获取{return\u isSome;}
}
公共图书馆没有
{
获取{return!\u isSome;}
}
公共价值
{
获取{返回_值;}
}
公共T值默认值(T值)
{
if(IsSome)
返回值;
返回值;
}
公共覆盖布尔等于(对象对象对象)
{
var temp=作为选项的obj;
if(temp==null)
返回false;
if(this.IsNone&&temp.IsNone)
返回true;
if(this.IsSome和temp.IsSome)
{
var item1=此.Value;
var item2=温度值;
返回object.Equals(item1,item2);
}
返回false;
}
公共覆盖int GetHashCode()
{
if(this.IsNone)
return base.GetHashCode()+23;
返回base.GetHashCode()+this.Value.GetHashCode()+23;
}
}
它基本上只是用户想要的任何类型T的包装器。它应该最终映射到T的一个可为空的版本。我一直找不到任何关于这样做的文档


非常感谢您的帮助。

以下是我用来作为IUserType类基础的一些文章:


我见过他们,他们在这种情况下帮不了什么忙。我也有同样的需要。