我有此代码:
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();
答案 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
中。然后,您可以使用EBook
和HardCopy
类中的特定属性来扩展这本书。
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]);