簡體   English   中英

Automapper:將int轉換為字符串

[英]Automapper: Convert an int to a string

我目前在我的c#MVC項目中使用AutoMapper,並遇到了從整數轉換為字符串的問題。

我有兩節課:

public class Job
{
    public string Prefix { get; set; }
    public int JobNumber { get; set; }
    public int Year { get; set }
    public int JobPriority { get; set; }

    public virtual EntityPriority EntityPriority { get; set; }
}

public class JobViewModel
{
    public string JobNumberFull { get; set; }
{

使用Automapper我想連接Job類中的所有三個屬性以形成一個字符串,然后將其映射到JobViewModel類中的JobNumberFull:

前綴jobnumber可以年

首先,我保持簡單,不將字段連接成字符串,我剛剛嘗試獲取JobNumber(int)並將其映射到JobNumberFull(字符串),如下所示:

Mapper.CreateMap<int, string>().ConvertUsing(Convert.ToString);
Mapper.CreateMap<Job, JobViewModel>()
    .ForMember(d => d.JobPriorityId, opt => opt.MapFrom(s => s.EntityPriority.EntityPriorityID))
    .ForMember(d => d.JobPriorityLevel, opt => opt.MapFrom(s => s.EntityPriority.PriorityLevel))
    .ForMember(d => d.JobNumberFull, opt => opt.MapFrom(s => s.JobNumberYear));
Mapper.AssertConfigurationIsValid();

var jobsList = db.Jobs.Where(j => j.OperationID == operationId).Project().To<JobViewModel>().ToList();

當我運行這個時,我得到以下錯誤

Type 'System.String' does not have a default constructor

我知道這跟你有關

Convert.ToString

但我不知道該怎么辦! 當從字符串轉到int時,我可以做Convert.ToInt32,它就像一個款待。 我是否需要創建自定義類型轉換器?

我如何獲得字符串前綴 - 作業編號年?

所有人都非常感謝。


UPDATE

感謝Jeremy和AutoMapper網站的幫助,我設法在這里工作是我的解決方案,如果您認為有更優雅的解決方案,請隨時評論:

public class Job 
{
    public string Prefix { get; set; }
    public int JobNumber { get; set; }
    public int Year { get; set; }
    public int JobPriority { get; set; }

    public virtual EntityPriority EntityPriority { get; set; }
}

public class JobViewModel 
{
    public int JobNumber { get; set; }
    public int Year { get; set; }
    public string JobNumberFull { get; set; }
}

public enum EntityPriority 
{
  Normal = 0,
  High
}

public interface IValueResolver
{
   ResolutionResult Resolve(ResolutionResult source);
}

public class JobNumberConverter : ValueResolver<Job, string>
{
    protected override string ResolveCore(Job source)
    {
        return string.Format("{0}-{1}-{2}", source.Prefix, source.JobNumber, source.Year);
    }
}

public ActionResult Index()
{
    Mapper.CreateMap<Job, JobViewModel>()
        .ForMember(jvm => jvm.JobNumberFull, opt => opt.ResolveUsing<JobNumberConverter>());
    Mapper.AssertConfigurationIsValid();

    List<Job> jobs = new List<Job>();

    Job j = new Job()
    {
        JobNumber = 1,
        Prefix = "prefix",
        Year = 2013,
        EntityPriority = EntityPriority.High,
        JobPriority = 2
    };

    Job j2 = new Job()
    {
        JobNumber = 2,
        Prefix = "prefix",
        Year = 2013,
        EntityPriority = EntityPriority.High,
        JobPriority = 2
    };

    Job j3 = new Job()
    {
        JobNumber = 3,
        Prefix = "prefix",
        Year = 2013,
        EntityPriority = EntityPriority.High,
        JobPriority = 2
    };

    jobs.Add(j);
    jobs.Add(j2);
    jobs.Add(j3);

    var jobViewModels = jobs.Select(job => Mapper.Map<JobViewModel>(job));

    return View();

}

我認為您可以使用ResolveUsing方法來解決它。

Mapper.CreateMap<Job, JobViewModel>()
    .ForMember(d => d.JobNumberFull,
    exp =>
    exp.ResolveUsing(j => string.Format("{0}-{1}-{2}", j.Prefix, j.JobNumber, j.Year)));

您需要為從Job到JobViewModel的轉換指定自定義轉換函數。

Mapper.CreateMap<Job, JobViewModel>().ConvertUsing(
  job => new JobViewModel {
    JobNumberFull = string.Format("{0}-{1}-{2}",
                      job.Prefix, job.JobNumber, Job.Year)
  });

要將Job轉換為JobViewModel,請使用Map函數。

var jobViewModel = Mapper.Map<JobViewModel>(job);

要將作業列表轉換為JobViewModel,請使用“ 選擇擴展名”方法。

var jobViewModels = jobs.Select(job => Mapper.Map<JobViewModel>(job));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM