2011-02-26 56 views
1

这里是我的属性定义:C# - 枚举自定义通过反射属性

[AttributeUsage(AttributeTargets.Field)] 
public class Optional : System.Attribute 
{ 
    public Optional() 
    { 
    } 
} 

在MyClass的:

[Optional] public TextBox Name; 

最后在另一个功能:

typeof(MyClass).GetFields().ToList<FieldInfo>().ForEach(x => writer.WriteLine(
    x.FieldType + " is called " + 
    x.Name + " and has attributes " + 
    x.GetCustomAttributes(true)[0] 
)); 

的问题是,我得到索引0的错误。我只想检查属性应用的字段。当我删除x.GetCustomAttributes(true)[0]时错误消失。

确切的错误:

异常详细信息:System.IndexOutOfRangeException:索引阵列的边界之外。

源错误:

Line 63:    } 
Line 64: 
Line 65:    typeof(T).GetFields().ToList<FieldInfo>().ForEach(x => writer.WriteLine(x.FieldType + " is called " + 
Line 66:     x.Name + " and has attributes " + 
Line 67:     x.GetCustomAttributes(true)[0]+ "</br>")); 
+0

有什么错误? – harpo 2011-02-26 08:00:34

+0

已添加 - 请记住,如果删除“GetCustomAttributes”部分,则会消失。 – 2011-02-26 08:04:28

回答

2

好像可能有两个问题在这里。要找到所有有你[可选]属性的领域,你想:

typeof(MyClass).GetFields().Where(
    f => f.GetCustomAttributes(typeof(OptionalAttribute), true).Any()) 

要写出在所有领域的自定义属性,你想:

typeof(MyClass).ToList<FieldInfo>().ForEach(x => 
{ 
writer.WriteLine(
    x.FieldType + " is called " + 
    x.Name + " and has attributes " + 
    string.Join(", ", x.GetCustomAttributes(true).Select(a => a.ToString()).ToArray())); 
}); 
+0

你给的第一部分让我对我的问题提出了最有说服力的解决方案。谢谢。 – 2011-02-26 08:13:26

1

你似乎已经聚集,因为你正在试图获得一个空数组,这当然是非法的0号元素,您收到此错误。您需要过滤掉不带任何属性的字段第一,像这样:

var fields = from fieldInfo in typeof(MyClass).GetFields() 
      let Attributes = fieldInfo.GetCustomAttributes(true) 
      where Attributes.Any() 
      select new { fieldInfo.FieldType, fieldInfo.Name, Attributes }; 

foreach (var field in fields) 
{ 
    writer.WriteLine(field.FieldType + " is called " + 
        field.Name + " and its first attribute is " + 
        field.Attributes.First()); 
} 

如果你是在那些与OptionalAttribute特别感兴趣,那么你可能在寻找这样的事情,而不是:

var fields = from fieldInfo in typeof(MyClass).GetFields() 
      let attributes = fieldInfo.GetCustomAttributes(true).OfType<OptionalAttribute>() 
      where attributes.Any() 
      select new { fieldInfo.FieldType, fieldInfo.Name, Attribute = attributes.Single() }; 

foreach (var field in fields) 
{ 
    writer.WriteLine(field.FieldType + " is called " + 
        field.Name + " and its OptionalAttribute is " + 
        field.Attribute); 
} 
+0

您指出问题出在没有定义属性的多个元素上。我希望我也可以接受你的答案。 – 2011-02-26 08:13:01

1

检查属性是否存在这样的:

x.GetCustomAttributes(true).Any(item => item is OptionalAttribute) 

我假定你将作为你的Optional属性重命名为OptionalAttribute所有属性都应该有“属性”后缀。