如何在c#中传递对象作为参数
本文关键字:对象 参数 | 更新日期: 2023-09-27 18:06:39
对不起,我可能缺乏术语,但我的搜索没有提供任何答案,除了琐碎的问题。-
我有一个超类,并希望能够创建任何子类的新对象,方法如下:
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?)"
在您的场景中,您指定了VehicleType
作为类型为object
声明的变量的名称。你不能像这样实例化对象
如果你能就你的问题提供更多的信息,我会尽量提供一个更具体的答案。
例如,你可以添加一个新的属性到你的Vehicle
类称为VehicleType
,它的类型将是enum
。
或者,如果您需要在一个集合中使用多种类型的车辆,您可能想要实现factory pattern
并使用interfaces
来处理集合。
根据注释进行编辑:
有多种方法可以做到这一点,所以我提到了到目前为止其他人没有提到的一种方法。它基于reflection
。基本上,您在程序集中搜索继承您的"超类"的类,如果它们的名称与提供的参数对应,则实例化它。然而,我们可以通过使用一个名为
Activator
的类来简化这个过程。我们所需要的只是包含所需类的程序集的名称及其名称。Activator将为我们创建它的实例。这里有一个例子让你开始:
public static SuperClass GetClass(string type)
{
return (SuperClass)Activator.CreateInstance("someAssemblyName", "type");
}
或从MSDN获取更多信息:http://msdn.microsoft.com/en-us/library/b4wc81dc.aspx
当然,你可以在任何进一步的操作之前修改属性,也许像这样:
public static SuperClass GetClass(string type, string brand, string model)
{
SuperClass sc = (SuperClass)Activator.CreateInstance("someAssemblyName", "type");
sc.Brand = brand;
sc.Model = model;
return sc;
}
如果您要使用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();
}
}
}
在c#中,类型信息通常以两种方式之一传递:类的实例、type或泛型类型参数。后者提供静态类型检查和约束。
在其他答案中还提到了其他策略,但您可能会发现它们既麻烦又不合适。
试试这个:
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
});
}
}
注意:
- 车辆栏目:品牌、车型、年份、价格
- 车辆的通用参数。AddNewVehicle
- 如果你想让Vehicle的子类以不同的方式对待参数,把这些字段变成虚拟/抽象属性,并根据需要重写它们的set/get行为。