Как я могу привести объект к другому типу объекта со всеми теми же свойствами, кроме нового типа имеет еще одно поле - PullRequest
2 голосов
/ 04 февраля 2020

Я пытаюсь привести тип навыка к типу SkillViewModel.

Здесь я пробую приведение:

    SkillViewModel skillViewModel = (SkillViewModel)skill;

Это моя модель навыков, которую я пытаюсь преобразовать:

    public class Skill
    {
         public int SkillId { get; set; }
         public string SkillName { get; set; }
         public string SkillDescription { get; set; }
         public int SkillLevelId { get; set; }
         public string SkillLevelDescription { get; set; }
         public int LevelId { get; set; }
         public int LevelNumber { get; set; }
    }

Это SkillViewModel, в который я пытаюсь конвертировать. Он наследует навык и имеет одно добавленное свойство RoleId:

    public class SkillViewModel : Skill
    {
         public int RoleId { get; set; }
    }

============================== ==================================================

Решено:

Вместо того, чтобы приводить объект умения к типу SkillViewModel, я просто создал новый экземпляр и явно скопировал каждый из них в умение SkillViewModel, добавив в конце роль roleId.

Вот так:

    private SkillViewModel[] GetRoleSpecificSkills(Skill[] skills, int roleId)
    {
        var results = new List<SkillViewModel>();

        foreach (var skill in skills)
        {
            SkillViewModel skillViewModel = new SkillViewModel();
            skillViewModel.SkillId = skill.SkillId;
            skillViewModel.SkillName = skill.SkillName;
            skillViewModel.SkillDescription = skill.SkillDescription;
            skillViewModel.SkillLevelId = skill.SkillLevelId;
            skillViewModel.SkillLevelDescription = skill.SkillLevelDescription;
            skillViewModel.LevelId = skill.LevelId;
            skillViewModel.LevelNumber = skill.LevelNumber;
            skillViewModel.RoleId = roleId;

            results.Add(skillViewModel);
        }

        return results.ToArray();
    }

Ответы [ 3 ]

2 голосов
/ 04 февраля 2020

Как правило, вы не можете приводить из несовместимого типа (такого как родительский класс) в C# или любого другого статически типизированного языка программирования в той степени: объект Skill имеет другое представление в памяти, чем SkillViewModel Область памяти объекта: Skill меньше на размер свойства RoleId, поэтому, если такое приведение вообще разрешено компилятором данного языка, то позже, если вы попытаетесь получить доступ к RoleId, оно будет приведет к нарушению памяти, поскольку смещение RoleId выходит за границы области памяти, выделенной для объекта Skill.

В случае преобразования из родительского класса в подкласс наилучший способ заключается в создании конструктора в SkillViewModel, который принимает объект Skill в качестве параметра, копирует все его свойства в свои собственные переменные экземпляра и присваивает некое вменяемое значение по умолчанию RoleId.
Обратите внимание, что все эти свойства теперь будет ссылаться на 2 объекта, поэтому, если какой-либо из них будет изменяемым, то изменение его на 1 объект также изменит его второе: иногда это может привести к неожиданным результатам, поэтому неизменные объекты обычно предпочтительнее, когда это возможно. Всякий раз, когда вы делаете новую ссылку на изменяемый объект, вы должны вместо этого сделать его глубокий клон: учтите снижение производительности и использования памяти, с одной стороны, и вероятность того, что кто-то сделает ошибку с другой.

2 голосов
/ 04 февраля 2020

Вы не можете бросить родителя ребенку таким образом. И это очень плохая практика.

Если вам действительно нужно понизить рейтинг, попробуйте следующее:

var jsonParent = JsonConvert.SerializeObject(parent); 
Child c = JsonConvert.DeserializeObject<Child>(jsonParent);
0 голосов
/ 04 февраля 2020

Вы сможете получить свойство RoleID, когда будете разыгрывать его следующим образом:

SkillViewModel skillViewModel = skill as SkillViewModel; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...