private static Accessor GetAccessor <TAttribute>(Type targetType)
where TAttribute : Attribute
{
Accessor accessor;
var cache = GetCache <TAttribute>();
if (cache.TryGetValue(targetType, out accessor))
{
return(accessor);
}
var member = FindMember <TAttribute>(targetType);
if (member == null)
{
cache[targetType] = NullCallback;
return(NullCallback);
}
var targetParameter = E.Parameter(typeof(object), "target");
var accessorExpression = E.Lambda <Accessor>(
E.Convert(
E.MakeMemberAccess(
E.Convert(targetParameter, targetType),
member),
typeof(object)),
targetParameter);
accessor = accessorExpression.Compile();
cache[targetType] = accessor;
return(accessor);
}