1
[XmlElement(ElementName = "SalesStageId", Form = XmlSchemaForm.None)]
public EntityIdentifier OpportunitySalesStageId { get; set; }

上面ElementName"SalesStageId"方法名称是"OpportunitySalesStageId"

有没有办法通过包含上述方法的类的对象从元素名中找出方法名。

4

1 回答 1

1
  1. 使用反射来获取类型的属性Type.GetProperties()
  2. 然后你可以搜索每个自PropertyInfo定义属性XmlElementAttributePropertyInfo.GetCustomAttribute
  3. 如果找到该属性(即不为空),您可以简单地查询其内容以查看它是否匹配。
  4. 对其余属性重复步骤 2 和 3

示例程序:

(使用 LINQ 和扩展方法进行了优化)

using System;
using System.Linq;
using System.Reflection;
using System.Xml.Schema;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string propName = FindPropertyNameByXmlElementAttributeElementName(typeof (MyClass), "Foo");

            Console.WriteLine(propName);
            Console.ReadKey();
        }
        static string FindPropertyNameByXmlElementAttributeElementName(Type type, string elementName)
        {
            PropertyInfo propertyInfo = 
                type.GetProperties().SingleOrDefault(
                        prop => prop.HasAttributeWithValue<XmlElementAttribute>(
                                a => a.ElementName == elementName
                            )
                    );
            if (propertyInfo == null)
            {
                return "NOT FOUND";
            }
            return propertyInfo.Name;
        }
    }

    public static class PropertyInfoExtensions
    {
        public static bool HasAttributeWithValue<TAttribute>(this PropertyInfo pi, Func<TAttribute, bool> hasValue)
        {
            TAttribute attribute = 
                (TAttribute)pi.GetCustomAttributes(typeof(TAttribute), true).SingleOrDefault();
            if (attribute == null)
            {
                return false;
            }
            return hasValue(attribute);
        }
    }
    class MyClass
    {
        [XmlElement(ElementName = "Foo", Form = XmlSchemaForm.None)]
        public string Rumplestiltskin { get; set; }
    }
}
于 2013-02-05T22:37:22.063 回答