如何在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?)"

如何在c#中传递对象作为参数

在您的场景中,您指定了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行为。