Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AutoMapper ForAllMaps覆盖自定义设置_C#_Automapper_Automapper 9 - Fatal编程技术网

C# AutoMapper ForAllMaps覆盖自定义设置

C# AutoMapper ForAllMaps覆盖自定义设置,c#,automapper,automapper-9,C#,Automapper,Automapper 9,在下面的示例中(在LinqPad中可执行),MyString变成“Hello World” 但是,如果我取消注释cfg.ForAllMaps,那么它只是“Hello”,显然会覆盖任何自定义设置 我希望使用cfg.ForAllMaps来设置一系列通用规则,例如,源上存在的属性与目的地的名称大不相同,但遵循一种通用模式,即源数据中的Person_Age将匹配名为Person的目的地类型上的Age属性,Animal_Age匹配Animal.Age等。除此之外,个人类型可能有我想做的特定定制 ForAl

在下面的示例中(在LinqPad中可执行),MyString变成“Hello World”

但是,如果我取消注释cfg.ForAllMaps,那么它只是“Hello”,显然会覆盖任何自定义设置

我希望使用cfg.ForAllMaps来设置一系列通用规则,例如,源上存在的属性与目的地的名称大不相同,但遵循一种通用模式,即源数据中的Person_Age将匹配名为Person的目的地类型上的Age属性,Animal_Age匹配Animal.Age等。除此之外,个人类型可能有我想做的特定定制

ForAllMaps是否要覆盖所有其他设置?如果是这样,是否有可能以我希望的方式使用它,即拥有一个可以覆盖的基线配置?或者,我是否应该使用其他API(我一直在摸索,但到目前为止还没有发现任何东西)

void Main()
{
var config=new-MapperConfiguration(cfg=>
{
//取消对此的注释,ForCtorParam覆盖无效
//cfg.ForAllMaps((类型映射,映射)=>
//      {
//      });
cfg.CreateMap()
.ForCtorParam(“myString”,x=>x.MapFrom(y=>$”{y.myString}World”);
});
config.assertconfigurationsvalid();
var mapper=config.CreateMapper();
var source=新源()
{
MyString=“你好”
};
var dest=mapper.Map(源);
dest.Dump();
}
公共类源
{
公共字符串MyString{get;set;}
}
公务舱目的地
{
公共字符串MyString{get;private set;}
公共目的地(字符串myString)
{
this.MyString=MyString;
}
}

进一步资料:

另外,我在ForAllMaps中执行的函数是:

void SetupMemberAndRenamedContructorParameter<T>(TypeMap typeMap, IMappingExpression map, string sourcePropertyName, string destinationPropertyName, string destinationContructorParamaterName)
{
    map.ForMember(destinationPropertyName, x => x.MapFrom(sourcePropertyName));

    var propertyInfo = (PropertyInfo)typeMap.SourceTypeDetails.PublicReadAccessors.Single(w => w.Name == sourcePropertyName);

    Expression<Func<object, T>> getValue = (sourceClassInstance) => (T)propertyInfo.GetValue(sourceClassInstance);

    map.ForCtorParam(destinationContructorParamaterName, x => x.MapFrom(getValue));
}

cfg.ForAllMaps((typeMap, map) =>
{
    SetupMemberAndRenamedContructorParameter<string>(typeMap, map, $"{typeMap.DestinationType.Name.ToUpper()}_ERROR", "ErrorCode", "errorCode");
    SetupMemberAndRenamedContructorParameter<int>(typeMap, map, $"{typeMap.DestinationType.Name.ToUpper()}_RATING", "Flag", "flag");
});

void setupmemberandNamedConductorParameter(类型映射类型映射、IMappingExpression映射、字符串sourcePropertyName、字符串destinationPropertyName、字符串destinationConductorParameterName)
{
map.ForMember(destinationPropertyName,x=>x.MapFrom(sourcePropertyName));
var propertyInfo=(propertyInfo)typeMap.SourceTypeDetails.PublicReadAccessors.Single(w=>w.Name==sourcePropertyName);
表达式getValue=(sourceClassInstance)=>(T)propertyInfo.getValue(sourceClassInstance);
ForCtorParam(destinationContractorParameterName,x=>x.MapFrom(getValue));
}
cfg.ForAllMaps((类型映射,映射)=>
{
SetupMemberandNamedConductorParameter(类型映射,映射,$“{typeMap.DestinationType.Name.ToUpper()}\u ERROR”,“ErrorCode”,“ErrorCode”);
SetupMemberandNamedConductorParameter(typeMap,map,$“{typeMap.DestinationType.Name.ToUpper()}{U评级”,“标志”,“标志”);
});

为了澄清我的主要问题是关于ForAllMaps是否覆盖CreateMap(),以及是否有一种方法可以使两者很好地协同工作,我的第二个示例可能会分散我的注意力。

ForAllMaps的摘要注释是“为所有类型映射指定公共配置”。你能解释一下你想要达到的目标吗?嗨@stuartd谢谢你的关注我添加了更多的细节。啊,这是个棘手的问题。您从源属性名派生目标类和属性名?这确实是一个棘手的问题:-)目标属性是,但由于所有类都遵循该模式,我可以通过字符串连接走一些捷径。我对自己的工作相当满意,然后意识到ForAllMaps正在破坏我的每类型配置。请参阅。您可以编写自定义命名约定。
void SetupMemberAndRenamedContructorParameter<T>(TypeMap typeMap, IMappingExpression map, string sourcePropertyName, string destinationPropertyName, string destinationContructorParamaterName)
{
    map.ForMember(destinationPropertyName, x => x.MapFrom(sourcePropertyName));

    var propertyInfo = (PropertyInfo)typeMap.SourceTypeDetails.PublicReadAccessors.Single(w => w.Name == sourcePropertyName);

    Expression<Func<object, T>> getValue = (sourceClassInstance) => (T)propertyInfo.GetValue(sourceClassInstance);

    map.ForCtorParam(destinationContructorParamaterName, x => x.MapFrom(getValue));
}

cfg.ForAllMaps((typeMap, map) =>
{
    SetupMemberAndRenamedContructorParameter<string>(typeMap, map, $"{typeMap.DestinationType.Name.ToUpper()}_ERROR", "ErrorCode", "errorCode");
    SetupMemberAndRenamedContructorParameter<int>(typeMap, map, $"{typeMap.DestinationType.Name.ToUpper()}_RATING", "Flag", "flag");
});