考虑以下自定义属性:
[Abc.Text(MaxLength=33)]
public Abc.Text heading = new Abc.Text();
MaxLength在TextAtrribute类中定义:
public class TextAttribute : Attribute
{
public int MaxLength {get; set;}
}
在其他代码中,Text类需要知道它的MaxLength。
有没有办法可以做到这样的事情:
int max = (int)heading.GetAttribute("MaxLength");
对答案的评论
RexM答案的这种修改起了作用:
System.Reflection.FieldInfo headingField = this.GetType().GetField("heading");
object[] attribs = headingField.GetCustomAttributes(typeof(Abc.TextAttribute), true);
if (attribs.Length == 1)
{
int max = ((Abc.TextAttribute)attribs[0]).AbcMaxLength;
}
但是我希望我能够在没有引用该领域的父母“this”的情况下做到这一点。 你能以某种方式得到一个领域的父母吗?这样可以解决它,例如
System.Reflection.FieldInfo headingField = heading.GetParent().GetType().GetField("heading");
答案 0 :(得分:3)
在当前对象的类型上使用GetCustomAttributes()方法。这将返回一个对象数组,表示该类型属性的实例,这些属性属于您指定的属性类型:
object[] attribs = this.GetType().GetCustomAttributes(typeof(Abc.Text));
if (attribs.Length == 1)
{
int max = ((Abc.Text)attribs[0]).MaxLength;
}
编辑:好的,通过你的澄清,我理解你想要做的更好一些。我想我第一次误读了你的代码示例。它本质上是相同的概念,但属性是在一个字段上,而不是类:
System.Reflection.FieldInfo headingField = this.GetType().GetField("heading");
object[] attribs = headingField.GetCustomAttributes(typeof(Abc.Text));
if (attribs.Length == 1)
{
int max = ((Abc.Text)attribs[0]).MaxLength;
}
再次编辑:为了获得该字段的句柄,您必须知道该字段所在的类型。一种简单的方法是使用this.GetType()
,但您也可以执行以下操作:
FieldInfo headingField = typeof(MyClass).GetField("heading");
答案 1 :(得分:-1)
您可以阅读here如何做您想做的事。
Type type = TextAttribute.GetType();
PropertieInfo pi = type.GetProperty("MaxLength");
if (pi.CanRead())
//the value
pi.GetValue();