Я работаю с Umbraco 4.7.1 и пытаюсь сопоставить узлы содержимого с некоторыми автоматически сгенерированными строго типизированными объектами. Я пытался использовать как valueinjecter, так и automapper, но OOTB ни один из них не отображает мои свойства. Я предполагаю, что это потому, что все свойства на узле Umbraco (документ cms) извлекаются следующим образом:
node.GetProperty("propertyName").Value;
И мои строго типизированные объекты имеют формат MyObject.PropertyName. Итак, как мне сопоставить свойство узла, которое извлекается с помощью метода и строки, начинающейся с символа нижнего регистра, со свойством MyObject, где свойство начинается с символа верхнего регистра?
ОБНОВЛЕНИЕ Мне удалось создать следующий код, который сопоставляет узел umbraco, как предполагалось, покопавшись в исходном коде Umbraco в поисках вдохновения о том, как преобразовать строковые свойства в строго типизированные свойства:
public class UmbracoInjection : SmartConventionInjection
{
protected override bool Match(SmartConventionInfo c)
{
return c.SourceProp.Name == c.TargetProp.Name;
}
protected override void Inject(object source, object target)
{
if (source != null && target != null)
{
Node node = source as Node;
var props = target.GetProps();
var properties = node.Properties;
for (int i = 0; i < props.Count; i++)
{
var targetProperty = props[i];
var sourceProperty = properties[targetProperty.Name];
if (sourceProperty != null && !string.IsNullOrWhiteSpace(sourceProperty.Value))
{
var value = sourceProperty.Value;
var type = targetProperty.PropertyType;
if (targetProperty.PropertyType.IsValueType && targetProperty.PropertyType.GetGenericArguments().Length > 0 && typeof(Nullable<>).IsAssignableFrom(targetProperty.PropertyType.GetGenericTypeDefinition()))
{
type = type.GetGenericArguments()[0];
}
targetProperty.SetValue(target, Convert.ChangeType(value, type));
}
}
}
}
}
Как видите, я использую SmartConventionInjection для ускорения работы. Для отображения примерно 16000 объектов по-прежнему требуется примерно 20 секунд. Можно ли это сделать еще быстрее?
Благодарность
Томас