[英]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
});
}
}
請注意:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.