由于我在谷歌和网站搜索中没有看到这个问题的答案,我认为我会把它变成这个网站上的伟大思想。
由于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的类型,或者我仅限于运行时检查。
提前致谢
答案 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