1

我确定解决方案非常明显,但是关于我将如何使用价值注入器执行以下操作的任何想法?

假设您有以下模型:

public class Foo{
    public int BarId{get;set;}
    public Bar Bar{get;set;}
}

public class Bar{
    public int Id{get;set;}
    [Required]
    public string Description{get;set;}
}

和一个看起来像这样的视图模型:

public class FooBarViewModel{
    public int BarId{get;set;}
    public bool EditMode{get;set;}
}

当我调用对象时InjectFrom<UnflatLoopValueInjection>()Foo我只想Foo.BarId填充属性,而不是Foo.Bar.Id属性。如果在图中较浅的深度找到与属性名称的完全匹配,我希望尽可能停止在整个对象图中递归的 Unflattening 过程。

理想情况下,我希望在不诉诸于明确忽略属性并能够按照惯例做到这一点的情况下做到这一点。

4

1 回答 1

0

深入研究了源代码,答案是我怀疑实现起来微不足道

public class UnflatLoopValueInjectionUseExactMatchIfPresent : UnflatLoopValueInjection {
    protected override void Inject(object source, object target) {
        var targetProperties = target.GetProps().Cast<PropertyDescriptor>().AsQueryable();
        foreach (PropertyDescriptor sourceProp in source.GetProps()) {
            var prop = sourceProp;
            if (targetProperties.Any(p => p.Name == prop.Name)) {
                //Exact match found
                targetProperties.First(p => p.Name == prop.Name).SetValue(target, SetValue(sourceProp.GetValue(source)));
            }
            else {
                //Fall back to UnflatLoopValueInjection
                var endpoints = UberFlatter.Unflat(sourceProp.Name, target, t => TypesMatch(prop.PropertyType, t)).ToList();
                if (!endpoints.Any()) {
                    continue;
                }
                var value = sourceProp.GetValue(source);
                if (!AllowSetValue(value)) {
                    continue;
                }
                foreach (var endpoint in endpoints) {
                    endpoint.Property.SetValue(endpoint.Component, SetValue(value));
                }
            }
        }
    }
}

如果未找到与 viewmodels 属性名称完全匹配的对象,上述注入只会深入(使用标准 UnflatLoopValueInjection 中的逻辑)深入到对象图中。

于 2013-07-24T15:21:35.380 回答