在編程世界里,使用“否定式”不是一件好事,因為它的可讀性並不高,但有時,為了讓使用者減少代碼量,還是使用了雙重否定,直到DefaultValue的出現,它改變了這一切,它可以為你的屬性設置你想要的默認值,如bool類型默認值是false,而如果你希望它的默認值是true,就需要用到DefaultValue這個特性了。
這是我IUnitOfWork代碼片斷
/// <summary> /// 工作單元 /// 提供一個保存方法,它可以對調用層公開,為了減少連庫次數 /// </summary> public interface IUnitOfWork { /// <summary> /// 將操作提交到數據庫, /// </summary> void Save(); /// <summary> /// 是否不提交到數據庫 /// 默認為false,即默認為提交到數據庫 /// </summary> /// <returns></returns> bool IsNotSubmit { get; set; } } /// <summary> /// 工作單元 /// 對泛型類型的支持 /// </summary> /// <typeparam name="T"></typeparam> public interface IUnitOfWork<T> : IUnitOfWork where T : class { }
上面代碼的IsNotSubmit就是一個否定式的,這不是我們推薦的,但沒辦法,使用它,可以簡化代碼!它的意思是不把修改提交到數據庫,bool類型默認是false
,也就是說,它默認是把修改提交的數據庫,怎么樣,挺繞吧,呵呵。
當DefaultValue出現后,就改變了這一切,你可以這樣定義它了
public interface IUnitOfWork { /// <summary> /// 將操作提交到數據庫, /// </summary> void Save(); /// <summary> /// 是否提交到數據庫 /// 默認為true,即默認為提交到數據庫 /// </summary> /// <returns></returns> [DefaultValue(true)] bool IsSubmit { get; set; } }
這樣的接口定義意思就很清晰了,IsSubmit就是提交,true就是提交,false就是不提交,多清晰呀,呵呵!
再來看如何得到IsSubmit的值,如果直接使用它結果還會是false,你需要反射一下,從TypeDescriptor里得到它的值才是DefaultValue,呵呵
/// <summary> /// 數據上下文 /// </summary> class DataContext : IUnitOfWork { #region IUnitOfWork 成員 public void Save() { throw new NotImplementedException(); } /// <summary> /// 類不會繼承接口的特性信息 /// </summary> [DefaultValue(true)] public bool IsSubmit { get; set; } #endregion }
好,我們現在輸出一下信息,看看IsSubmit的值
AttributeCollection attrColl = TypeDescriptor.GetProperties(new DataContext())["IsSubmit"].Attributes; DefaultValueAttribute attr = attrColl[typeof(DefaultValueAttribute)] as DefaultValueAttribute; bool _Value = (bool)attr.Value; Console.WriteLine(_Value);
結果:
怎么樣,現在程序中可以把否定式去掉了吧,呵呵
而將這個技術應用到我們的架構中,可以這樣來實現:(如果為IsSubmit設置了新值,就使用新值,如果沒有設置,那就用默認值,大家可以使用default(bool)得到bool類型的默認值,同理default(string)就是字符型的)
private bool isSubmit; /// <summary> /// 類不會繼承接口的特性信息 /// </summary> [DefaultValue(true)] public bool IsSubmit { get { return isSubmit; } set { AttributeCollection attrColl = TypeDescriptor.GetProperties(this)["IsSubmit"].Attributes; DefaultValueAttribute attr = attrColl[typeof(DefaultValueAttribute)] as DefaultValueAttribute; if (value == default(bool)) isSubmit = (bool)attr.Value; else isSubmit = value; } }