Преобразовать объект (не определен) в объект с типом - PullRequest
0 голосов
/ 16 марта 2020

У меня есть этот код:

object temp;

if (choice == 1)
{
    temp = new HardCopy();
    Books = p.AddBook(temp, Books);
}
else
{
    //EBook temp = new EBook();
    //Books = p.AddBook(temp, Books);
}

Этот тип работает, но на другой стороне p.AddBook есть оператор if, который фактически является дубликатом, исключая один атрибут. (У HardCover есть Index, тогда как у EBook есть Keyword).

Я хотел бы знать, есть ли способ создать переменную Type, которую C# принимает (как мне кажется, не из моего тестирования), а затем используйте этот тип для приведения объекта на другую сторону метода.

if (book.GetType().Name == "HardCopy") {
    HardCopy temp = new HardCopy();

Это то, что я делаю, чтобы выбрать между сегментами if.

Что-то на то, что я ищу:

Object temp;

if (choice == 1) {
    temp = new HardCopy();
    (...)
}

Books = p.AddBook(temp, Books);

Без необходимости делать это изнутри if. Затем с другой стороны, что-то вроде:

Console.Write("Please Enter the Name of the Book: ");
((TypeVariable)temp).Name = Console.ReadLine();

Ответы [ 3 ]

2 голосов
/ 16 марта 2020

OOP основы.

Создайте базовый класс для своих книг:

class Book { }

Получите из этого:

class HardCopy : Book { }
class EBook : Book { }

Измените AddBook, чтобы принять Book:

AddBook(Book book, //..

Тогда вы можете сделать это:

Book temp;

if (choice == 1)
{
    temp = new HardCopy();
}
else 
{
    temp = new EBook();
}

Books = p.AddBook(temp, Books);
0 голосов
/ 16 марта 2020

Кажется, что вы хотите создать объект с заданным типом. Отражение может быть использовано здесь.

Для данного объекта типа Activator.CreateInstance() создаст объект во время выполнения.

Например, вы хотите создать объект temp, тип которого совпадает с book:

var temp = Activator.CreateInstance(book.GetType());

Если вы хотите создать объект на основе параметра change, вы можете заранее сохранить отношения отображения, а затем создавать объекты на основе вашего выбора.

var mappings = new Dictionary<int, Type>
{
    [1] = typeof(HardCopy),
};
var temp = Activator.CreateInstance(mappings[change]);
0 голосов
/ 16 марта 2020

Создайте абстракцию для своих объектов, кажется, что Book было бы хорошим началом.

public abstract class Book { }

Переместить все обыкновенные в новый Book. Затем вы можете расширить книгу, указав c атрибуты в классах EBook и HardCopy.

public class EBook : Book { }
public class HardCopy : Book { }

Теперь вы можете ссылаться на оба этих объекта, используя полиморфизм, подобный этому: Book book = new EBook();

И тогда вы можете go опередить и использовать шаблон проектирования Abstract Factory, в котором вы будете создавать экземпляр любой из реализаций и назначать этот экземпляр переменной базового класса.

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