检查是否设置了属性属性而没有try-catch;

时间:2018-10-05 11:20:54

标签: .net reflection attributes .net-core-2.0

System.ComponentModel.DataAnnotations.DisplayAttribute具有属性(例如AutoGenerateField,AutoGenerateFilter,Order)。如果未设置这些属性中的任何一个,则在尝试读取时会出错。

object valAttrProp ;
var atProp = attrInstance.GetType().GetProperties();

foreach (var propInfo in atProp)
{
   if (propInfo.CanRead )
   {
       try
       {
           // all bottom lines generate an exception... 
           // valAttrProp = propInfo.GetGetMethod().Invoke(attrInstance,null);  
           // valAttrProp = valAttrProp.GetAccessors()[0].Invoke(attrInstance, null);
           // even with direct accessor:
           // valAttrProp = ((System.ComponentModel.DataAnnotations.DisplayAttribute)attrInstance).Order;

           valAttrProp = propInfo.GetValue(attrInstance);

       }
       catch 
       {
           valAttrProp = null;
       }

       if (valAttrProp != null)
       {    
          // ...proccessing
       }
   }
}

attrInstance in debugger

我如何找出:是否设置了attrs而没有try-catch块?

1 个答案:

答案 0 :(得分:0)

我终于明白了拉瑟·沃格瑟尔·卡尔森(LasseVågsætherKarlsen)在说什么。

对于许多属性(例如AutoGenerateField),文档中有一个备注:

  

请勿使用此属性访问AutoGenerateField属性。   而是使用GetAutoGenerateField方法。

但是由于某种原因,Order字段没有这样的注释,但是在我看来,在这种情况下,放置指向相应方法的链接是合乎逻辑的 在类GetGetMethod的{​​{1}}字段中。但是由于某种原因,存在方法PropertyInfo(可能是get-accessor?)。我想通过反射收到指向所需方法的链接,

否则,解决方案不好:

get_PropName