2010-06-29 110 views
0

因为我没有在我的Google和网站搜索中看到这个问题的答案,所以我认为我会在这个网站上构成伟大的头脑。由于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; } 

现在清楚,当我尝试将此属性为它的默认值绑定,我会收到一个错误投。好奇的是,如果无论如何强制将DefaultValue的类型强制为int,还是仅限于运行时检查。

在此先感谢

回答

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