簡體   English   中英

如何在C#中將對象作為參數傳遞

[英]How to pass object as parameter in c#

抱歉,我可能缺少術語,但是盡管有一些瑣碎的問題,但我的搜索沒有提供任何答案。 開始 -

我有一個超類,並希望能夠使用如下方法創建任何子類的新對象:

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/zh-cn/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 )。

然后是值得商bat的靜態方法

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的類
  • 沒有包含包含在其中聲明VehicleType類的名稱空間的using語句
  • 錯過了對引用您的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
        });
    }
}

請注意:

  • 車輛具有以下字段:品牌,型號,年份和價格
  • Vehicle.AddNewVehicle的通用參數
  • 如果要讓Vehicle的子類以不同的方式處理參數,請將這些字段轉換為虛擬/抽象屬性,並根據需要覆蓋其set / get行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM