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

时间:2013-03-31 21:57:03

标签: c# object parameters

抱歉,我可能缺乏术语,但我的搜索没有提供任何答案,尽管有一些微不足道的问题。在这里 -

我有一个超类,希望能够使用如下方法创建任何子类的新对象:

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?)"

3 个答案:

答案 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
        });
    }
}

请注意:

  • 车辆具有以下字段:品牌,型号,年份和价格
  • 关于Vehicle.AddNewVehicle的通用参数
  • 如果您希望Vehicle的子类以不同方式处理参数,请将这些字段转换为虚拟/抽象属性,并根据需要覆盖其设置/获取行为。