2009-06-30 120 views
3

是否有可能只做某種類型的轉換並直接映射到System.Drawing.Color?我將顏色存儲爲html/css值。即#ffffff。我不想創建一個實現IUserType的自定義類型,它只是System.Drawing.Color的一個包裝。NHibernate映射到System.Drawing.Color

+0

爲什麼你不想爲此創建一個用戶類型?它正是你正在試圖做的...... – 2009-06-30 14:26:27

+0

大衛 - 原因是因爲已經有一個類型,System.Drawing.Color,可以使用。爲什麼重新創建該類型? – 2009-06-30 14:34:04

+2

NHibernate用戶類型並沒有取代這種類型,它只是實現了將數據庫字段轉換爲該類型的邏輯。您使用該類型進行映射,將字符串存儲在數據庫中,並將您的屬性公開爲System.Drawing.Color。將發佈代碼... – 2009-06-30 14:38:31

回答

6

試試這個大小。 NHibernate用戶類型不會替換您想要公開的類型,它只是提供了從存儲的數據庫類型自動映射到.NET類型(在此,從字符串到顏色,反之亦然)的機制。

public class ColorUserType : IUserType 
{ 
    public bool Equals(object x, object y) 
    { 
     if (ReferenceEquals(x, y)) return true; 
     if (x == null || y == null) return false; 
     return x.Equals(y); 
    } 

    public int GetHashCode(object x) 
    { 
     return x == null ? typeof(Color).GetHashCode() + 473 : x.GetHashCode(); 
    } 

    public object NullSafeGet(IDataReader rs, string[] names, object owner) 
    { 
     var obj = NHibernateUtil.String.NullSafeGet(rs, names[0]); 
     if (obj == null) return null; 
     var colorString = (string)obj; 
     return ColorTranslator.FromHtml(colorString); 
    } 

    public void NullSafeSet(IDbCommand cmd, object value, int index) 
    { 
     if (value == null) 
     { 
      ((IDataParameter)cmd.Parameters[index]).Value = DBNull.Value; 
     } 
     else 
     { 
      ((IDataParameter)cmd.Parameters[index]).Value = ColorTranslator.ToHtml((Color)value); 
     } 

    } 

    public object DeepCopy(object value) 
    { 
     return value; 
    } 

    public object Replace(object original, object target, object owner) 
    { 
     return original; 
    } 

    public object Assemble(object cached, object owner) 
    { 
     return cached; 
    } 

    public object Disassemble(object value) 
    { 
     return value; 
    } 

    public SqlType[] SqlTypes 
    { 
     get { return new[] {new SqlType(DbType.StringFixedLength)}; } 
    } 

    public Type ReturnedType 
    { 
     get { return typeof(Color); } 
    } 

    public bool IsMutable 
    { 
     get { return true; } 
    } 
} 

以下映射應該再工作:

<property 
    name="Color" 
    column="hex_color" 
    type="YourNamespace.ColorUserType, YourAssembly" /> 

爲了完整,並感謝約什 - 對於這一點,如果你使用FluentNHibernate,你可以這樣映射它:

Map(m => m.Color).CustomTypeIs<ColorUserType>(); 
0

我會做這樣的:

我會創造在我的課私有字符串屬性或字段,並映射這個屬性/域至您使用的顏色存儲在數據庫中的列。

然後,我會在我的類中創建一個公共屬性,該屬性返回一個Color,並且在該屬性的getter中,我會將存儲在私有字段/屬性中的字符串轉換爲Color,並在setter,我會將字符串字段/屬性設置爲與給定的顏色值相對應的值。

public class MyEntity 
{ 

    private string htmlColorString; 

    public Color TheColor 
    { 
     get { return System.Drawing.ColorTranslator.FromHtml (htmlColorString); } 
     set 
     { 
       htmlColorString = System.Drawing.ColorTranslator.ToHtml(value); 
     } 
    } 

} 
+0

您可以將十六進制轉換爲RGB,然後使用Color.FromArgb()方法。 – 2009-06-30 14:27:49

0

我會去的弗雷德裏克實施方法和做轉換如下:

轉換十六進制RGB - 每一對十六進制值是RGB分量中的一個 - #23FF00意味着R = 23 ,G = FF,B = 00。

這會給你的int值的每個RGB分量的,你做一些字符串在你的十六進制值解析後:

int.Parse("FF", System.Globalization.NumberStyles.AllowHexSpecifier); 

之後,只需調用Color.FromArgb()靜態和你」會有你的顏色。