将对象(未定义)转换为具有类型的对象

时间:2020-03-16 13:49:19

标签: c# oop object casting

我有此代码:

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具有索引,而EBook具有关键字)。

我想知道是否有一种方法可以创建C#接受的变量Type(因为在我的测试中似乎没有),然后使用该Type将对象强制转换为方法的另一侧

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 个答案:

答案 0 :(得分:2)

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);

答案 1 :(得分:0)

为您的对象创建一个抽象,看来Book是一个好的开始。

public abstract class Book { }

将所有共同点移动到新的Book中。然后,您可以使用EBookHardCopy类中的特定属性来扩展这本书。

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

现在,您可以使用多态性来引用这两个对象,如下所示: Book book = new EBook();

然后您可以继续使用Abstract Factory设计模式,该模式将创建任一实现的实例并将该实例分配给基类变量。

答案 2 :(得分:0)

似乎您想创建具有给定类型的对象。可以在这里使用反射。

给出一个Type对象,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]);