【问题标题】:Compiler does not see my concrete types编译器看不到我的具体类型
【发布时间】:2013-07-18 03:30:24
【问题描述】:

您好,我创建了一个使用泛型的类。这是我的代码:

public class RegisterMappings : IRegisterMappings
    {
      public virtual void CreateMap<TFrom, TTo>()
        {
            Mapper.CreateMap<TFrom, TTo>();
        }

        public void PostRegisterMappings()
        {
            Mapper.AssertConfigurationIsValid();
        }

        public void CreateGetUpcommingLessons<GetUpcomingLessons_Result , UpcomingLessonDTO>()
        {
            Mapper.CreateMap<GetUpcomingLessons_Result, UpcomingLessonDTO>().ForMember(dest => dest.TeacherOfficialName, opt => opt.Ignore());
        }
}

在我的例子中,编译器似乎没有将 GetUpcomingLessons_Result 和 UpcommingLessonsDTO 视为具体类型。

我已经为它们添加了 using 语句,但 resharper 告诉我它们可以被删除,因为它们不是用户。

如何让编译器看到 GetUpcomingLessons_Result 和 UpcommingLessonsDTO 是具体类型?

编辑

这是我的案例,我试图围绕 Autommapper 的 Mapper 函数创建一个 wapper。 这就是前两种方法的用途。

我的问题是我的目标还有一个属性。这是我的来源:

public partial class GetUpcomingLessons_Result
{
    public string CourseName { get; set; }
    public string ModuleName { get; set; }
    public Nullable<int> ModuleInstanceId { get; set; }
    public int StudentAssignmentId { get; set; }
    public int StudentAssignmentInstanceId { get; set; }
    public Nullable<System.DateTime> EventDate { get; set; }
    public Nullable<System.DateTime> StartTime { get; set; }
    public Nullable<System.DateTime> EndTime { get; set; }
    public string TeacherLastName { get; set; }
    public string TeacherMiddleName { get; set; }
    public string TeacherGender { get; set; }
    public Nullable<int> LessonNumber { get; set; }
    public string LocationName { get; set; }
}

这是我的目的地:

public class UpcomingLessonDTO
{
    public string CourseName { get; set; }
    public string ModuleName { get; set; }
    public int? ModuleInstanceId { get; set; }
    public int StudentAssignmentId { get; set; }
    public int StudentAssignmentInstanceId { get; set; }
    public DateTime? EventDate { get; set; }
    public DateTime? StartTime { get; set; }
    public DateTime? EndTime { get; set; }
    public string TeacherLastName { get; set; }
    public string TeacherMiddleName { get; set; }
    public string TeacherGender { get; set; }
    public int? LessonNumber { get; set; }
    public string LocationName { get; set; }

    // calculated fields
    public string TeacherOfficialName { get; set; }
}

我需要告诉映射器忽略 TeacherOfficialName 名称。直到现在这很容易,我会这样写:

Mapper.CreateMap<GetUpcomingLessons_Result, UpcomingLessonDTO>().ForMember(dest => dest.TeacherOfficialName, opt => opt.Ignore()); 

但是在创建包装器之后,我需要为这种情况创建另一个方法,这就是为什么我需要 GetUpcomingLessons_Result 和 UpcomingLessonDTO 的具体类型。

【问题讨论】:

  • 具体类型? 认为这意味着什么?
  • 我创建的类

标签: c# .net generics automapper


【解决方案1】:

您应该从CreateGetUpcommingLessons 签名中删除泛型类型:

public void CreateGetUpcommingLessons()
{
    Mapper.CreateMap<GetUpcomingLessons_Result, UpcomingLessonDTO>().ForMember(dest => dest.TeacherOfficialName, opt => opt.Ignore());
}

您现在拥有它的方式是让编译器使用GetUpcomingLessons_ResultUpcomingLessonDTO 作为泛型类型(它将使用用户输入的类型)而不是实际类型。为了更清楚,您当前的实现等同于这个:

public void CreateGetUpcommingLessons<TValueA, TValueB>()
{
    Mapper.CreateMap<TValueA, TValueB>().ForMember(dest => dest.TeacherOfficialName, opt => opt.Ignore());
}

【讨论】:

  • 这个不行我还是需要把映射保存在我的配置文件里
  • 我需要能够在我的配置文件中调用这样的东西: m_RegisterMappingsapper.CreateGetUpcommingLessons.() 然后能够在我的 RegisterMappings 类中调用 Mapper.CreateMap().ForMember(dest => dest.TeacherOfficialName, opt => opt.Ignore());
  • 嗯......你是对的,但如果我添加 dest.TeacherOfficialName 我会得到一个构建错误......我需要能够以某种方式将其转换为正确的类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
相关资源
最近更新 更多