在编程世界里,使用“否定式”不是一件好事,因为它的可读性并不高,但有时,为了让使用者减少代码量,还是使用了双重否定,直到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);
结果:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQ0AAAArCAIAAADt8krAAAACoklEQVR4nO2dS27DMAwFfbQcLUfTsssueqAuChiqST5SsuM4xsxKpih+LL0EiVN0+fn+ej6fj8ejtdZaW5ZlWRY9/rtsHUuAmN3EGfXXeaMa7MLIYmfPiQMXZdVJb3TPrntA9TZHs278on8lr+sp6nc72vifEwcuitWJ2G8xu0GcAGtv/0n9RV6Rzq2/7v+uOHAJNjrRh9g66G2OohWdhf+oTqL66/7vigOXoNeJOKmrfY9Ohpy1/4ROREnCYs/3S+PARRn6HJ9eirX6QOg4Ff+iZ/F828tz4sBF2eikZ/Vx7UX/3hjVYJ2Fv8ibxt/p/6448H7c77sA4B/oBCAHnQDkoBOAHHQCkINOAHLQCUBO9PzkRek++rnBaPFzD1vmqhpdZfN+7r6cgfu7laGjUM/Vh92/u9Nr98QZFcnQqgN1Uo+z2XF04hP9vquyZ0P7unHeo5OjXvYm4lxQJ4fE4Z0koaKT1rEubAZ3amN0a6jEPyrveiniCFzPoX57e6XluX7nptymRM2Vem7C0PtJenOFf+Rc2YNK3or/aP262mLeUf+oZreFomWiL1uDLaAyvgmj7yfRvva4/tq5Po5CNYM7G6UuIlIXlxT7Wsf9wM1V70vcIn1L3XrcsRv8DqQ6Ke6ra6ysrfiP5rW4mzexnWKJKHKiL3t/7O2KSjqqr9Qoerkb6fddlX095ByckLdoXy124yPP/eNoqh+kBaR9RRSbnevrDlSen/RGd2sn/ItGO67kjeIU6x+Kv8e+BHoQvdsp0bXty0VH0DcnqqeS95PgeTxADjoByEEnADnoBCAHnQDkoBOAHHQCkINOAHLQCUAOOgHIQScAOegEIAedAOSgE4AcdAKQI/7/yT3/kABgAnQCkINOAHLQCUAOn+MBUn4B+kiRLJ6IxogAAAAASUVORK5CYII=" alt="" />
怎么样,现在程序中可以把否定式去掉了吧,呵呵
而将这个技术应用到我们的架构中,可以这样来实现:(如果为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;
}
}