0

我正在寻找初始化一组看起来有点像这样的视图模型对象:

public class ModelA
{
    public GraphModel SomeGraph { get; set; }
    public GraphModel SomeGraph2 { get; set; }
    public TableModel SomeTable { get; set; }
    public GraphModel SomeGraph3 { get; set; }
}

public class ModelB
{
    public GraphModel SomeGraph { get; set; }
    public TableModel SomeGraph2 { get; set; }
    public TableModel SomeTable { get; set; }
    public FieldModel SomeField { get; set; }
}

现在我可以显式地初始化它们,new TableModel()new GraphModel()我真的更愿意动态地完成它,所以我构建了一个迭代所有属性并为每种类型填充一组预定义初始化器的过程:

new Dictionary<Type, Func<object>>
    {
        {typeof (...), () => new ...{x = y}},
        {typeof (...), () => new ...{z = y, c = g}},
        {typeof (...), () => new ...{z = q}},
        {typeof (...), () => new ...{x = y}},
    };

由于我有很多这些并且反射成本很高,我想知道AutoMapper 中的某种基于默认类型的映射是否可以实现相同的效果,因为我猜它最终会使用缓存的预编译表达式。

4

1 回答 1

0

您是否考虑过使用T4为 AutoMapper 配置生成一些 Factory 或只是 BeforeMap 方法?假设您有以下包含所有初始化程序的类。

namespace App
{
    public class Defaults
    {
        private static Dictionary<Type, Func<object>> _initializer = new Dictionary<Type, Func<object>>
        {
            {typeof (FieldModel), () => new FieldModel {X = "X"}},
            {typeof (TableModel), () => new TableModel {Y = "Y", Z = "Z"}}
        };

        public static Dictionary<Type, Func<object>> Initializer
        {
            get { return _initializer; }
            set { _initializer = value; }
        }
    }
}

然后添加如下文本模板:

在此处输入图像描述

作为转换的结果,我们得到一个包含以下内容的文件:

public class Factory
{
    public App.ModelA Initizlize(App.ModelA source)
    {
         source.SomeTable = (App.TableModel)App.Defaults.Initializer[typeof(App.TableModel)].Invoke();
         return source;
    }
    public App.ModelB Initizlize(App.ModelB source)
    {
         source.SomeGraph2 = (App.TableModel)App.Defaults.Initializer[typeof(App.TableModel)].Invoke();
         return source;
    }
}

是关于 T4 的非常好的资源。

于 2013-11-06T21:38:03.743 回答