Cache property lookups for the object parsing
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using Fasterflect;
|
||||
|
||||
namespace LeafWeb.Core.Utility
|
||||
{
|
||||
public class ParseInfoPropertyMatcher<T>
|
||||
where T : new()
|
||||
{
|
||||
public IList<PropertyInfo> ParseInfoProperties { get; }
|
||||
|
||||
public ParseInfoPropertyMatcher()
|
||||
{
|
||||
ParseInfoProperties = GetParseInfoProperties();
|
||||
}
|
||||
|
||||
private PropertyInfo[] GetParseInfoProperties()
|
||||
{
|
||||
var propertyInfos = typeof(T).Properties();
|
||||
return propertyInfos.Where(p => AttributeExtensions.HasAttribute<ParseInfoAttribute>(p)).ToArray();
|
||||
}
|
||||
|
||||
public virtual PropertyInfo MatchProperty(string title, int position)
|
||||
{
|
||||
return
|
||||
ParseInfoProperties.FirstOrDefault(p => p.Attribute<ParseInfoAttribute>().IsTitleMatch(title)) ??
|
||||
ParseInfoProperties.FirstOrDefault(p => p.Attribute<ParseInfoAttribute>().IsPositionMatch(position));
|
||||
}
|
||||
|
||||
public virtual PropertyInfo MatchPropertyExact(string title, int position)
|
||||
{
|
||||
return
|
||||
ParseInfoProperties
|
||||
.FirstOrDefault(p =>
|
||||
{
|
||||
var attribute = p.Attribute<ParseInfoAttribute>();
|
||||
return attribute.IsTitleMatch(title) && attribute.IsPositionMatch(position);
|
||||
});
|
||||
}
|
||||
|
||||
public virtual bool IsPropertiesTitlesMatch(string[] titles)
|
||||
{
|
||||
var propertyMatch = 0;
|
||||
var propertyNoMatch = 0;
|
||||
|
||||
for (var i = 0; i < titles.Length; i++)
|
||||
{
|
||||
var title = titles[i];
|
||||
var position = i + 1;
|
||||
if (String.IsNullOrEmpty(title))
|
||||
continue;
|
||||
|
||||
var property = MatchPropertyExact(title, position);
|
||||
|
||||
if (property != null)
|
||||
propertyMatch++;
|
||||
else
|
||||
propertyNoMatch++;
|
||||
}
|
||||
|
||||
return propertyMatch / (double)propertyNoMatch > .9;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user