2011-04-12 42 views
0

我一直在努力尋找從用戶定義的輸入中調用一個類的實例的方法。C#,從字符串中調用一個類的實例

基本上我想從我的StandardVehicle類中調用一個已經定義的實例,但問題是我調用的實例的名稱是由用戶在窗體上的組合框中選擇來定義的。

這是我如何設想它將被格式化,但是當我嘗試調用實例並說我不能從字符串轉換爲StandardVehicle時,出現錯誤。

 StandardVehicle VauxhallB = new StandardVehicle(); 
     VauxhallB.Model = "B"; 
     VauxhallB.Manufacturer = "Vauxhall"; 
     VauxhallB.Doors = 5; 
     VauxhallB.HorsePower = 200; 
     VauxhallB.Transmission = "Manual"; 
     VauxhallB.Year = 2009; 
     VauxhallB.Cylinders = 6; 
     VauxhallB.Seats = 7; 
     VauxhallB.Price = 17000; 
     VauxhallB.Registration = "abc1243"; 

     StandardVehicle objname = comboBox1.Text; 

我假定這只是格式化字符串的情況下,但我一直在尋找小時,不能找出它需要什麼樣的格式是在將它定義爲一個實例。

任何幫助,將不勝感激。

問候, S.

+0

這是不是它是如何工作的。除非您自己提供一個字符串,否則不會將字符串隱式轉換爲StandardVehicle。 – driis 2011-04-12 17:58:09

+0

您不能將字符串轉換爲像這樣的對象。你有一個你綁定到組合框的'StandardVehicle'實例列表嗎? – manji 2011-04-12 17:58:47

回答

4

不,這絕對不只是格式化字符串的情況下。這聽起來像你想

Dictionary<string, StandardVehicle> 

填充是從字符串對象映射,然後查找對應於用戶給定的名稱的對象。

1

VauxhallB只是計算機的一個符號。用戶不應該引用變量名 - 儘管通過反射可能會這樣做,但這是編程的一個複雜方面。

更好的方法是將每個實例與Dictionary<string, StandardVehicle>中的字符串「名稱」相關聯,然後查找。喜歡的東西:

Dictionary<string, StandardVehicle> nameMap = new Dictionary<string, StandardVehicle>(); 
nameMap["VauxhallB"] = VauxhallB; 
StandardVehicle objname = nameMap[comboBox1.Text]; 

而且,它通常是更具可讀性,如果你只使用局部變量小寫的名字,以更好地類,公共方法和屬性相區分。

+0

這似乎工作,感謝您的快速回復 – Stephen 2011-04-12 18:18:01

0

試試這個:

StandardVehicle selectedObject = (StandardVehicle)comboBox1.SelectedItem; 

當然,你的組合框應該綁定到StandardVehicles的集合......如果不是的話,那麼去解釋作爲已經建議。

0

首先,我還認爲你的意思是反射,但你總是想使用你的類StandardVehicle。只有屬性應該由您從用戶處收到的單個字符串設置。

給自己寫一個構造函數。您可以定義單個字符串的格式,例如該字符串中的固定位置:

public StandardVehicle(String data) 
{ 
    this.Model = data.Substring(0, 1); 
    this.HorsePower = Int32.Parse(data.Substring(1, 4); 
} 

不是很舒服,但可能會工作。添加一些錯誤處理。或XML加載或其他格式。

0

這比您的示例稍微複雜一些。我要開始快速和簡單的方法,這雖然方便快捷,是一種反模式的,但我會解釋說,在最後:

IBritishAuto car; 

switch 
{ 
    case "Vauxhall": 
    { 
     car = new Vauxhall(standardVehicle);  
     break; 
    } 
    case "Jaguar": 
    { 
     car = new Jaguar(standardVehicle); 
    } 
    ...etc. 
} 

之所以這樣,是次優的是,每次你想添加一個新的汽車類型,你必須修改原來的代碼塊,並有風險迴歸。如果您對此解決方案感到滿意,並且不在乎,您可以立即停止閱讀。

還有嗎?

這種模式被稱爲「條件調度器」。有兩個主要的策略可以改進它:重構Command模式(因爲它是Gang of Four模式而受到限制),或者更廣泛地實現一個名爲「控制反轉」的概念。如果你有興趣,這裏是你的谷歌條款:

「重構條件調度器」 「控制倒置」。

祝你好運。

1

你不能把字符串轉換爲對象,除非你有

  1. 構造函數字符串,並創建所需的對象
  2. 顯式/隱式轉換操作

和另一種選擇

使用Activator.CreateInstace

第三個選項是唯一有效的,如果字符串中包含有效的類型名稱,你的榜樣,你可以做

Type type = Type.GetType(comboBox1.Text); 
StandardVehicle objname = Activator.CreateInstace(type); 

這將工作,如果comboBox1.Text == "StandardVehicle"

點擊此處瞭解詳情:

http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx

http://msdn.microsoft.com/en-us/library/wccyzw83.aspx

相關問題