我目前有一个班级' ArisingViewModel'它有大约20-30个属性,当我生成各种数据时,将检查10,000次以上。
最初我有一个方法从XML字符串中检索出现的属性值:
public object GetArisingPropertyValue(string propertyName)
{
switch (propertyName)
{
case "name_1":
return Name1;
case "another_name":
return AnotherName;
// etc.
}
}
但是这适用于使用属性字典,以便更容易更新,并使项目的其他部分更容易生活。所以我设置了我的属性字典:
private static readonly IDictionary<string, string> PropertyMap;
static ArisingViewModel()
{
PropertyMap = new Dictionary<string, string>();
var myType = typeof(ArisingViewModel);
foreach (var propertyInfo in myType.GetProperties(BindingFlags.Instance | BindingFlags.Public))
{
if (propertyInfo.GetGetMethod() != null)
{
var attr = propertyInfo.GetCustomAttribute<FieldNameAttribute>();
if (attr == null)
continue;
PropertyMap.Add(attr.FieldName, propertyInfo.Name);
}
}
}
我将属性应用于任何相关的属性,如:
[FieldName("name_1")]
public string Name1
{
get
{
return _arisingRecord.Name1;
}
}
然后使用以下方法查找属性名称/值:
public static string GetPropertyMap(string groupingField)
{
string propName;
PropertyMap.TryGetValue(groupingField, out propName);
return propName; //will return null in case map not found.
}
public static object GetPropertyValue(object obj, string propertyName)
{
return obj.GetType().GetProperty(propertyName).GetValue(obj, null);
}
我的问题是,我发现使用旧的switch语句可以更快地处理(使用非常简单的计时器类来测量系统的使用时间 - 约20秒vs~25秒)
任何人都可以建议我做错了什么,或者改进当前代码的方法吗?
答案 0 :(得分:1)
我建议从StringTemplate 4的C#端口(BSD 3子句许可证)实现类似于ObjectModelAdaptor
的类。此功能在模板渲染管道的性能关键部分中大量使用,并且分析表明当前实现执行得非常好。
此类使用相当有效的缓存和分发机制,但可以使用ConcurrentDictionary
并删除lock
语句来改进.NET 4+用户。
您可能希望更改FindMember
的实现,以使用属性实现特定于您的属性的逻辑。