GetMember与C#中的GetField性能

时间:2012-03-23 10:54:34

标签: c# performance reflection

任何人都知道最好用什么来阅读XmlEnumAttribute

选项1:使用GetMember

    public static string XmlEnum(this Enum e)
    {
        Type type = e.GetType();
        MemberInfo[] memInfo = type.GetMember(e.ToString());
        if (memInfo != null && memInfo.Length > 0)
        {
            object[] attrs = memInfo[0].GetCustomAttributes(typeof(XmlEnumAttribute), false);
            if (attrs != null && attrs.Length > 0)
            {
                return ((XmlEnumAttribute)attrs[0]).Name;
            }
        }
        return e.ToString();
    }

选项2:使用GetField

    public static string XmlEnum2(this Enum e)
    {
        Type type = e.GetType();
        FieldInfo info = type.GetField(e.ToString());
        if (!info.IsDefined(typeof(XmlEnumAttribute), false))
        {
            return e.ToString();
        }
        object[] attrs = info.GetCustomAttributes(typeof(XmlEnumAttribute), false);
        return ((XmlEnumAttribute)attrs[0]).Name;
    }

1 个答案:

答案 0 :(得分:6)

  

为什么不尝试100,000次,看看每种情况需要多长时间?

因为这不会测试属性的实际使用方案。 第一次时间挖掘属性是很昂贵的,之后便宜。费用是为属性类加载IL并对其进行编译,将属性数据定位在程序集元数据中并从磁盘加载它。然后调用属性构造函数并分配属性属性。您的代码读取属性的成本是花生与此相比,它是昂贵的磁盘I / O几个数量级。第二次检索属性时,很多工作都已完成,而且速度很快,只是从缓存的数据初始化对象。

您通常只读取一次属性,可能只读取一次。所以成本主要是昂贵的第一次,你使用的代码很少。来吧,剖析它。只要确保你没有把这个昂贵的第一次视为“实验性错误”。