Question

I am working with Umbraco 4.7.1 and I am trying to map the content-nodes to some autogenerated strong typed objects. I have tried using both valueinjecter and automapper, but OOTB neither of them map my properties. I guess it is because all properties on an Umbraco node (the cms document) are retrieved like this:

node.GetProperty("propertyName").Value;

And my strongly typed objects are in the format of MyObject.PropertyName. So how do I map the property on the node which is retrieved using a method and a string beginning with a lowercase character into a property on MyObject where the property begins with an uppercase character ?

UPDATE I managed to create the following code which maps the umbraco node as intended, by digging around in the Umbraco sourcecode for some inspiration on how to cast string-properties to strongly typed properties:

    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));
                }
            }
        }
    }
}

As you can see I use the SmartConventionInjection to speed things up. It still takes approximately 20 seconds to map something like 16000 objects. Can this be done even faster ?

thanks

Thomas

Était-ce utile?

La solution

with ValueInjecter you would do something like this:

public class Um : ValueInjection
{
    protected override void Inject(object source, object target)
    {
        var node = target as Node;
        var props = source.GetProps();
        for (int i = 0; i < props.Count; i++)
        {
            var prop = props[i];
            target.GetProperty(prop.Name).Value;

        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top