抱歉,我可能缺乏术语,但我的搜索没有提供任何答案,尽管有一些微不足道的问题。在这里 -
我有一个超类,希望能够使用如下方法创建任何子类的新对象:
static void AddNewVehicle(string brand, string model, int year, int price)
{
V.Add(new Car(brand, model, year, price));
}
我想我能够这样做:
static void AddNewVehicle(object VehicleType, string brand, string model, int year, int price)
{
V.Add(new VehicleType(brand, model, year, price));
}
...但我收到以下错误:
"The type or namespace name 'VehicleType' could not be found (are you missing a using directive or an assembly reference?)"
答案 0 :(得分:3)
在您的方案中,您已将VehicleType
指定为使用类型object
声明的变量的名称。你无法实例化这样的对象。
如果您可以提供有关问题的更多信息,我会尝试提供更具体的答案。
例如,您可以在名为Vehicle
的{{1}}类中添加新属性,它的类型为VehicleType
。
或者,如果您在一个集合中需要多种类型的车辆,或许您希望实施enum
并使用factory pattern
来处理集合。
根据评论进行修改:
有多种方法可以做到这一点,所以我提到了迄今为止其他人没有提到过的方法。它基于interfaces
。基本上,您在程序集中搜索继承“超类”的类,如果它们的名称与提供的参数相对应,则实例化它。
但是,我们可以使用名为reflection
的类来简化此过程。我们需要的只是包含所需类及其名称的程序集的名称。 Activator将为我们创建它的实例。
以下是一个让您入门的示例:
Activator
来自MSDN的更多信息:http://msdn.microsoft.com/en-us/library/b4wc81dc.aspx
当然,您可以在进行任何进一步操作之前修改属性,可能是这样的:
public static SuperClass GetClass(string type)
{
return (SuperClass)Activator.CreateInstance("someAssemblyName", "type");
}
答案 1 :(得分:1)
如果您要采用Factory
方法,请将其用作工厂。一个静态类,构造东西。不多也不少。不要在该工厂中放置状态来存储对象(列表V
)。
然后是有争议的静态方法
static void AddNewVehicle(object VehicleType, string brand, string model, int year, int price)
{
V.Add(new VehicleType(brand, model, year, price));
}
你想在这做什么?您传递一个名为VehicleType的对象,但是您想在正文中构建一个新对象?
然后编译错误:
找不到类型或命名空间名称'VehicleType'(您是否缺少using指令或程序集引用?)
这意味着你要么:
VehicleType
using
语句,其中包含声明类VehicleType
的名称空间VehicleType
的项目的引用。(或上述任何组合)
您提供的代码示例中的更多字词
我们假设你有这些类:
public class VehicleType
{
... some properties, constructors and methods
}
public class Car : VehicleType
{
... some properties, constructors and methods
}
然后你就可以创建一个生产新车辆的工厂类,比如
public static class VehicleFactory
{
public static Vehicle CreateVehicle(...)
{
// conditional stuff that decides what kind of vehicle to construct
if (...)
{
return new Bicycle(...);
}
else if (...)
{
return new Car(...);
}
else
{
throw new UnsupportedVehicleException();
}
}
}
希望这会对你有所帮助。
答案 2 :(得分:1)
在C#中,类型信息通常以两种方式之一传递:类的实例,Type或泛型类型参数。后者为您提供static type checking and constraints。
其他答案中提到了其他策略,但您可能会发现它们既麻烦又不合适。
试试这个:
class Vehicle
{
static ICollection<Vehicle> V;
string Brand;
string Model;
int Year;
int Price;
static void AddNewVehicle<T>(string brand, string model, int year, int price)
where T : Vehicle, new()
{
V.Add(new T() {
Brand = brand,
Model = model,
Year = year,
Price = price
});
}
}
请注意: