【发布时间】: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
}
}
}
我怎样才能知道:是否在没有 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