【问题标题】:Check if attribute property is set without try-catch;检查是否在没有 try-catch 的情况下设置了属性属性;
【发布时间】:2018-10-08 18:22:38
【问题描述】:

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

我怎样才能知道:是否在没有 try-catch 块的情况下设置了 attrs?

【问题讨论】:

  • 尝试使用Get方法,如果没有分配相应的属性,它们似乎返回null
  • 尝试读取属性调用异常。请参阅调试器屏幕。
  • 但如果设置了属性 - 问题就消失了。
  • ...尝试使用 Get 方法...我不明白发生了什么。你能举个例子吗。访问属性是通过反射发生的 - 如果演讲是关于属性对象的访问者,那么我没有机会直接调用他。(尽管即使在这种情况下也会发生错误((System.ComponentModel.DataAnnotations.DisplayAttribute) attrInstance).Order )。尝试通过 GetAccessors 方法读取类型访问器,返回调用错误的相同 get_Order() 方法。 p.GetAccessors()[0].Invoke(attrInstance, null);

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


【解决方案1】:

我终于明白 Lasse Vågsæther Karlsen 在说什么了。

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

不要使用此属性来访问 AutoGenerateField 属性。 而是使用 GetAutoGenerateField 方法。

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

否则解决方法不好:

object val = null;

// bad line
var getMethogInfo = attrInstance.GetType().GetMethod("Get" + propInfo.Name);

if (getMethogInfo != null)
{
    val = getMethogInfo.Invoke(attrInstance, null);
}
else
{
    try
    {
       val = attrInstance.GetValue(at);
    }
    catch
    {
       val = null;
    }
}

【讨论】:

    猜你喜欢
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多