自定义属性和类型检查

时间:2010-06-29 02:28:43

标签: c# .net attributes

由于我在谷歌和网站搜索中没有看到这个问题的答案,我认为我会把它变成这个网站上的伟大思想。

由于C#不支持通用属性(确实有意义),我想知道是否有办法根据正在装饰的类型将参数/属性的类型限制为属性。例如:

[AttributeUsage(AttributeTargets.Property)]
public class ColumnBindAttribute : Attribute
{
    public string ColumnName { get; set; }
    public object DefaultValue { get; set; }
}

[ColumnBind(ColumnName = "Category", DefaultValue = "No Category")]
public int CategoryId { get; set; }

现在很明显,当我尝试将此属性绑定到其默认值时,我将收到强制转换错误。好奇,如果无论如何要对int强制执行DefaultValue的类型,或者我仅限于运行时检查。

提前致谢

1 个答案:

答案 0 :(得分:2)

据我所知,没有办法对属性的单个属性强制执行特定于类型的检查。但是,请注意,这不是最优雅的解决方案,您可以使用多态来获得优势:

[AttributeUsage(AttributeTargets.Property)]
public class ColumnBindAttribute: Attribute
{
    public string ColumnName { get; set; }
    public object DefaultUntypedValue 
    {
        get;
        protected set;
    }
}

[AttributeUsage(AttributeTargets.Property)]
public class ColumnBindGenericAttribute<T> : ColumnBindAttribute
{    
    public T DefaultValue 
    { 
        get { return (T)DefaultUntypedValue; }
        set { DefaultUntypedValue = value; }
    }
}

[AttributeUsage(AttributeTargets.Property)]    
public class ColumnBindInt32Attribute: ColumnBindGenericAttribute<int> {}

[ColumnBindInt32(ColumnName = "Category", DefaultValue = 100)]
public int CategoryId { get; set; }

检索属性时,搜索会查找实际应用于该成员的属性的特定类型以及基本类型。即使它们是派生属性,您也可以检索装饰成员的所有ColumBindAttributes。

编辑:

道歉。如果任何泛型类型直接或间接派生自Attribute类型,则代码将不会编译。这使得ColumnBindGenericAttribute类无法实现。我以为我在编译器中找到了一个漏洞......结果比我更聪明。 :P