【问题标题】:Using Reflection to find [XmlAttribute("IWantThisValueRightHere")]使用反射查找 [XmlAttribute("IWantThisValueRightHere")]
【发布时间】:2009-06-19 15:55:38
【问题描述】:

我有一个具有一些基本属性的类...

[XmlAttribute("MyFirstProperty")]
public string FirstProperty { get; set; }

[XmlAttribute("MySecondProperty")]
public string SecondProperty { get; set; }

使用反射,我可以枚举公共属性并为上面的每个属性获取 PropertyInfo 对象......我现在唯一需要的是一种方法:

  1. 检测属性是否具有 XmlAttribute(我认为这可以通过 PropertyInfo.IsDefined(typeof(XmlAttribute), true) 工作,但想确定)
  2. 获取XmlAttribute的字符串值

这是怎么做到的?

【问题讨论】:

    标签: c# reflection


    【解决方案1】:
     object[] attribs = myPropertyInfo.GetCustomAttributes(typeof(XmlAttribute),false);
     bool doesPropertyHaveAttrib =attribs.Length > 0; 
     string name = (XmlAttribute)(attribs[0].AttributeName);
    

    乔尔在 cmets 中的观点很好。我的错。固定。

    【讨论】:

    • 你将不得不在最后一行进行一些转换。 System.Object 没有 AttributeName 属性。
    • 最简单的“修复”是使用 Attribute[] attribs = Attribute.GetAttributes(myPropertyInfo, typeof(XmlAttribute));
    【解决方案2】:

    我意识到这是一个老问题。今天偶然发现了同样的问题,这里提供的解决方案都没有奏效。特别是看到建议的解决方案Attribute.GetCustomAttributes(typeof(XmlAttribute),false) 引发异常,因为 XmlAttribute 不是从 System.Attribute 派生的。相反,您应该检查XmlAttributeAttribute

    为了将来参考,这是使用反射检查 XmlAttribute 的正确且有效的方法:

    PropertyInfo[] objProperties = obj.GetProperties();
    
    foreach (var prop in objProperties)
    {
    Attribute[] propXmlAttr = Attribute.GetCustomAttributes(prop, typeof(XmlAttributeAttribute), false);
    if (propXmlAttr.Length > 0)
         string myAttribute = propValue.ToString());
    }
    

    【讨论】:

      【解决方案3】:

      我目前使用这种方法:

      '获取属性

             Dim pi() As PropertyInfo = arguments.SourceObject.GetType.GetProperties(BindingFlags.Instance Or BindingFlags.Static Or BindingFlags.Public Or BindingFlags.GetProperty)
      

      '获取属性的属性

      dim pitem As PropertyInfo=pi(0)

                 Dim vobj() As Object = pitem.GetCustomAttributes(GetType(ValidationSettingsBaseAttribute), False)
      
      
                Dim attr As ValidationSettingsBaseAttribute= TryCast(vobj(0), ValidationSettingsBaseAttribute)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-03
        • 1970-01-01
        • 2011-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多