提高 object.GetType().GetProperties() 和 PropertyInfo.GetValue(object) 性能
Improve object.GetType().GetProperties() and PropertyInfo.GetValue(object) performance
private int GenerateKey(T requestParams)
{
foreach (PropertyInfo property in requestParams.GetType().GetProperties())
{
var propertyValue = property.GetValue(requestParams);
// Do stuff with propertyValue
}
// ...
}
我有这个代码片段,它遍历通用类型属性并提取每个 属性 的值。我知道反射可能是一个巨大的性能瓶颈,可以使用委托/DynamicMethod/ILGenerator 来改进它。然而要掌握这些却相当困难。关于如何使用其中一种方法的示例非常棒。
private PropertyInfo[] Properties { get; }
private Func<T, PropertyInfo, object> ExecutableGetter { get; }
public Constructor()
{
Properties = typeof(T).GetProperties();
Expression<Func<T, PropertyInfo, object>> getter = (tParams, property) => property.GetValue(tParams);
ExecutableGetter = getter.Compile();
}
private int GenerateKey(T requestParams)
{
foreach (PropertyInfo property in Properties)
{
var propertyValue = ExecutableGetter(requestParams, property);
// Do stuff with propertyValue
}
// ...
}
使用表达式树/委托的解决方案
private int GenerateKey(T requestParams)
{
foreach (PropertyInfo property in requestParams.GetType().GetProperties())
{
var propertyValue = property.GetValue(requestParams);
// Do stuff with propertyValue
}
// ...
}
我有这个代码片段,它遍历通用类型属性并提取每个 属性 的值。我知道反射可能是一个巨大的性能瓶颈,可以使用委托/DynamicMethod/ILGenerator 来改进它。然而要掌握这些却相当困难。关于如何使用其中一种方法的示例非常棒。
private PropertyInfo[] Properties { get; }
private Func<T, PropertyInfo, object> ExecutableGetter { get; }
public Constructor()
{
Properties = typeof(T).GetProperties();
Expression<Func<T, PropertyInfo, object>> getter = (tParams, property) => property.GetValue(tParams);
ExecutableGetter = getter.Compile();
}
private int GenerateKey(T requestParams)
{
foreach (PropertyInfo property in Properties)
{
var propertyValue = ExecutableGetter(requestParams, property);
// Do stuff with propertyValue
}
// ...
}
使用表达式树/委托的解决方案