下面是ISubject界面。部分student_subject和Tutor_subject都是自动生成的,但这些部分类用于允许父gemeroc抽象类。
在我将student_Subject“sub”传递给新的SubjectDTO(ISubject主题)之前,它具有所有属性。例如,sub.name等于“math”。
但是,一旦我将它传递给构造函数,SubjectDTO(ISubject subject)的所有属性都是null。
抱歉,如果我看起来很新,但有人知道为什么对象不会保留其属性。 这是代码
public abstract class ISubject
{
public int SubjectId { get; set; }
public string Name { get; set; }
public System.Data.Entity.Spatial.DbGeography Location { get; set; }
public virtual ICollection<ICourse> Courses { get; set; }
}
public partial class Student_Subject :ISubject
{
public DbSet<Student_Subject> getContext(studytree_dbEntities db)
{ return db.Student_Subject; }
}
public partial class Tutor_Subject :ISubject
{
public DbSet<Tutor_Subject> getContext(studytree_dbEntities db)
{ return db.Tutor_Subject; }
}
这是自动生成的类
public partial class Student_Subject
{
public Student_Subject()
{
this.Courses = new HashSet<Student_Course>();
}
public int SubjectId { get; set; }
public string Name { get; set; }
public int Student_CourseId { get; set; }
public System.Data.Entity.Spatial.DbGeography Location { get; set; }
public virtual ICollection<Student_Course> Courses { get; set; }
public virtual Student Student { get; set; }
}
}
这是我的StudentDTO。
public class StudentDTO
{
public StudentDTO()
{
this.StudySessions = new HashSet<StudySessionDTO>();
this.Subjects= new HashSet<SubjectDTO>();
}
public StudentDTO(Student s)
{
this.StudentId = s.StudentId;
this.FirstName = s.FirstName;
this.LastName = s.LastName;
this.StudySessions = new HashSet<StudySessionDTO>();
this.Subjects = new HashSet<SubjectDTO>();
foreach(Student_Subject sub in s.Subjects)
{
this.Subjects.Add(new SubjectDTO(sub));
}
}
}
主题DTO 但是,当执行到此类时,该对象具有所有null属性。
public class SubjectDTO
{
public SubjectDTO()
{
this.Courses = new HashSet<CourseDTO>();
}
public SubjectDTO(ISubject subject)
{
this.SubjectId = subject.SubjectId;
this.SubjectName = subject.Name;
this.Location = subject.Location;
this.Courses = new HashSet<CourseDTO>();
foreach(ICourse course in subject.Courses)
{
this.Courses.Add(new CourseDTO(course));
}
}
这是例外
发生了'System.NullReferenceException'类型的异常 StudyTree.dll但未在用户代码中处理
附加信息:对象引用未设置为的实例 对象
InnerException对象引用未设置为对象的实例。
StackTrace:在StudyTree.Models.SubjectDTO..ctor(ISubject主题) 在c:\ Users \ Ethan \ Documents \ Visual Studio中 2013 \ Projects \ StudyTree \ StudyTree \ Models \ SubjectDTO.cs:第21行at StudyTree.Models.StudentDTO..ctor(学生) c:\ Users \ Ethan \ Documents \ Visual Studio 2013 \ Projects \ StudyTree \ StudyTree \ Models \ UserDTO.cs:第118行 StudyTree.Models.PersonDTO..ctor(人物)in c:\ Users \ Ethan \ Documents \ Visual Studio 2013 \ Projects \ StudyTree \ StudyTree \ Models \ UserDTO.cs:第31行 StudyTree.Repository.LoginRepository.getPersonDTO(Person p)in c:\ Users \ Ethan \ Documents \ Visual Studio 2013 \项目\ StudyTree \ StudyTree \库\ LoginRepository.cs:行 41在MvcApplication2.Controllers.ProfileController.Login(JObject j)在c:\ Users \ Ethan \ Documents \ Visual Studio中 2013 \项目\ StudyTree \ StudyTree \ \控制器ProfileController.cs:行 34在lambda_method(Closure,Object,Object [])at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor&LT;&GT; c__DisplayClass10.b__9(对象 instance,Object [] methodParameters)at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(对象 instance,Object [] arguments)at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext,IDictionary`2参数,CancellationToken 的CancellationToken)
答案 0 :(得分:1)
您声明自己在[{1}}和ISubject
课程中实施名为Student_Subject
的界面。尽管如此,情况并非如此,您从名为Tutor_Subject
的抽象类中真正继承。前缀ISubject
必须 ONLY 用于接口,而不是抽象类。
问题来自你认为抽象类会像接口一样反应的事实。
当实施界面时,您需要履行合同,重写您班级中的所有代码。
当继承一个类(来自抽象的一个事件)时,你不必重写超类中定义的代码。
您实际上重新定义了子类中的属性I
,它隐藏了超类的属性。 Visual Studio会显示有关该内容的警告。
Name
需要关键字new
,因为其隐藏属性Name
。
要纠正这一点,只需将ISubject.Name
替换为public abstract class ISubject
即可创建一个真正的界面,并在界面正文中进行必要的更改。