C# AutoMapper不是';t识别特定于配置文件的前缀

C# AutoMapper不是';t识别特定于配置文件的前缀,c#,.net,automapper,C#,.net,Automapper,我试图使用AutoMapper从属性名之前有前缀的类中获取数据,并将其映射到没有这些前缀的第二个类。但是,我不一定希望它总是去掉前缀:我只希望它为这个特定的映射这样做 我的源类如下所示: public class AdvancedSearchFilterDataModel { // .... public string ServiceMeterNumber { get; set; } // .... } [DataContract] public class Ser

我试图使用AutoMapper从属性名之前有前缀的类中获取数据,并将其映射到没有这些前缀的第二个类。但是,我不一定希望它总是去掉前缀:我只希望它为这个特定的映射这样做

我的源类如下所示:

public class AdvancedSearchFilterDataModel
{
    // ....

    public string ServiceMeterNumber { get; set; }

    // ....
}
[DataContract]
public class ServicesAdvancedSearchFilterData : AdvancedSearchFilterData
{
    // ....

    [DataMember]
    public string MeterNumber { get; set; }

    // ....
}
public class PersonCustomMapping : ICustomMapping
{
    const string separator = " ";

    private static IMappingEngine _MappingEngine;
    public IMappingEngine MappingEngine
    {
        get
        {
            if (_MappingEngine == null)
            {
                var configuration = new ConfigurationStore(new TypeMapFactory(), AutoMapper.Mappers.MapperRegistry.Mappers);
                configuration.RecognizePrefixes("Person");
                configuration.RecognizeDestinationPrefixes("Person");

                configuration.CreateMap<Person, MCIACRM.Model.Combine.PersonCombined>();
                configuration.CreateMap<MCIACRM.Model.Combine.PersonCombined, Person>();


                _MappingEngine = new MappingEngine(configuration);
            }

            return _MappingEngine;
        }
    }
}
    private IMappingEngine mappingEngine
    {
        get
        {
            if (_mappingEngine == null)
            {
                _mappingEngine = AutoMapper.Mapper.Engine;
            }

            return _mappingEngine;
        }
    }
我的目标类如下所示:

public class AdvancedSearchFilterDataModel
{
    // ....

    public string ServiceMeterNumber { get; set; }

    // ....
}
[DataContract]
public class ServicesAdvancedSearchFilterData : AdvancedSearchFilterData
{
    // ....

    [DataMember]
    public string MeterNumber { get; set; }

    // ....
}
public class PersonCustomMapping : ICustomMapping
{
    const string separator = " ";

    private static IMappingEngine _MappingEngine;
    public IMappingEngine MappingEngine
    {
        get
        {
            if (_MappingEngine == null)
            {
                var configuration = new ConfigurationStore(new TypeMapFactory(), AutoMapper.Mappers.MapperRegistry.Mappers);
                configuration.RecognizePrefixes("Person");
                configuration.RecognizeDestinationPrefixes("Person");

                configuration.CreateMap<Person, MCIACRM.Model.Combine.PersonCombined>();
                configuration.CreateMap<MCIACRM.Model.Combine.PersonCombined, Person>();


                _MappingEngine = new MappingEngine(configuration);
            }

            return _MappingEngine;
        }
    }
}
    private IMappingEngine mappingEngine
    {
        get
        {
            if (_mappingEngine == null)
            {
                _mappingEngine = AutoMapper.Mapper.Engine;
            }

            return _mappingEngine;
        }
    }
当我尝试像这样映射值时,它会起作用:

Mapper.Configuration.RecognizePrefixes("Service");
Mapper.CreateMap<AdvancedSearchFilterDataModel, ServicesAdvancedSearchFilterData>();
ServicesAdvancedSearchFilterData servciesFilterData = 
    Mapper.Map<ServicesAdvancedSearchFilterData>(model);
Mapper.Configuration.RecognizePrefixes(“服务”);
CreateMap();
服务高级搜索筛选器数据服务筛选器数据=
Mapper.Map(模型);
但我只希望“服务”被识别为某些映射的前缀,因为它在其他映射中也被用作属性名称的正常部分。我尝试使用配置文件处理此问题,但这不起作用--未映射任何数据:

Mapper.CreateProfile("ServicePrefix").RecognizePrefixes("Service");
Mapper.CreateMap<AdvancedSearchFilterDataModel, ServicesAdvancedSearchFilterData>()
    .WithProfile("ServicePrefix");
ServicesAdvancedSearchFilterData servciesFilterData = 
    Mapper.Map<ServicesAdvancedSearchFilterData>(model);
Mapper.CreateProfile(“服务前缀”).RecognizePrefixes(“服务”);
Mapper.CreateMap()
.WithProfile(“服务前缀”);
服务高级搜索筛选器数据服务筛选器数据=
Mapper.Map(模型);

我怎样才能让它只在我想要的时候识别前缀,或者使用配置文件或者其他技术?(我还有其他前缀,我需要它以同样的方式识别其他映射。)

我通过创建以下结构实现了此功能:

我的视图中有一个从PersonCombined展平的Person模型

public class PersonCombined
{
    public Person Person { get; set; }
    public Address DefaultAddress { get; set; }
    public Contact EmailContact { get; set; }
    public Contact PhoneContact { get; set; }
    public Contact WebsiteContact { get; set; }
}

public class Person : IWebServiceModel
{
    public int ID { get; set; }

    public string PersonFirstName { get; set; }
    public string PersonSurname { get; set; }
    public string PersonDescription { get; set; }
    public Nullable<bool> PersonIsActive { get; set; }
}
最后,在我的通用视图构造函数中,我有:

    public GenericEntityController(IGenericLogic<S> logic, ICustomMapping customMapping)
        : base()
    {
        this._mappingEngine = customMapping.MappingEngine;
        this.logic = logic;
    }
public GenericEntityController(IGenericLogic逻辑、ICustomMapping自定义映射)
:base()
{
这是._mappingEngine=customMapping.mappingEngine;
这个逻辑=逻辑;
}
我就是这样做的:
result=items.Project(mappingEngine.To()
logic.Update(mappingEngine.Map(wsItem))

因为每个视图使用1个实体,所以可以为每个实体定义自定义映射配置。
希望这有帮助

谢谢。我最终以一种不同的方式实现了它,所以我无法测试它,也无法亲自验证它是否有效,但无论如何,我将尝试将它标记为“正确”,并希望它对下一个遇到这种情况的人有所帮助。以我的拙见,我发现这个解决方案达到了f***的复杂程度。我会手动完成。@JJS你能分享你实现它的不同方式吗?