获取类和SetValue中属性的自定义属性

时间:2013-01-05 14:19:00

标签: c# .net reflection

我只想尝试一些事情。我做了一种OR / M型映射器,因为我使用反射,性能很慢。如何加快速度或采用更好,更有效的方法?

我有一个带有命名参数的自定义属性,允许多个 然后我使用Reflection来:

  • 获取包含自定义属性修饰的属性
  • 找到每个属性,获取自定义属性数据
  • 为每个自定义属性数据,获取命名参数

然后检查命名参数memberinfo名称以查看它是否与该属性的相关命名参数匹配,如果匹配,则获取为该命名参数设置的值,最后从dataReader读取该命名参数值的数据并使用.SetValue将读取器读取的值设置为属性。

这是一些代码(不以任何方式完成),并希望有人可以告诉我如何获得性能提升。 运行它10,000次(在此之前初次调用JIT excersize等...)给了我这些平均时间:

3.79ms

以手动方式(即从DB到DTO的硬编码映射):0.05ms

我知道这就像"另一个OR / M" - 但它不是那样的,它比我更有趣。

private T Populate<T>(IDataReader reader) where T : class, new()
{ 
   T val = new T();

            if (reader != null && !reader.IsClosed)
            {

                var propsWithSQLColumnNameAttributes = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static).Where(prop => Attribute.IsDefined(prop, typeof(SQLColumnNameAttribute)) && prop.CanWrite && prop.GetSetMethod() != null);

                foreach (var currentProperty in propsWithSQLColumnNameAttributes)
                {   
                    foreach (var currentAttributeForProperty in currentProperty.GetCustomAttributesData())
                    {
                        string currentAttribParamValue = null;
                        foreach (var currentNamedArgument in currentAttributeForProperty.NamedArguments)
                        {
                            if (String.Equals(currentNamedArgument.MemberInfo.Name, SQLColumnNameAttribute.PropertyNames.DataColumnNamePropertyName, StringComparison.OrdinalIgnoreCase))
                            {
                                currentAttribParamValue = currentNamedArgument.TypedValue.Value == null ? null : currentNamedArgument.TypedValue.Value.ToString();


                                if (reader.DoesFieldExist(currentAttribParamValue))
                                {
                                    var dbRecordValue = reader[currentAttribParamValue] == DBNull.Value ? null : reader[currentAttribParamValue];

                                    currentProperty.SetValue(val, dbRecordValue, null);
                                }
                                break;
                            }
                        }
                    }
                }
            }

            return val;
}

不是最好的代码,但无论如何,perf是这里的问题,并且想要知道如何通过使用不同的反射方法来改进它,或者可能使用的算法的排序和种类不正确

非常感谢 - 我希望这个问题有道理。

1 个答案:

答案 0 :(得分:2)

请查看此页面http://www.codeproject.com/Articles/503527/Reflection-optimization-techniques,看看它是否对您有所帮助。 它讨论了许多场景中的反射优化,一旦你想学习,这可能是一个很好的资源。