簡體   English   中英

將C#對象更改為在運行時確定的類型

[英]change C# object to type decided at run-time

問題

我有一個WinForms程序,該程序必須使用不同的連接類型(例如TCP,USB等)與不同的硬件進行通信。使用連接需要使用VISA提供的一組常見操作(例如打開,讀取,寫入,關閉) 。 數據如何傳遞到這些功能或使用之前或之后可能需要應用於數據的任何轉換將因連接類型而異。

當某種方法確定特定的硬件操作需要某種類型的連接(由某些其他數據指定)時,這些連接用於連接到不同的硬件。

在將來的某個時候,我可能想添加更多類型的連接。

應用程序的用戶可以選擇和編輯連接部分,該連接部分需要更改連接類型(即,從使用TCP更改為使用USB)。 更改類型意味着將使用不同的方法實現來操作物理連接。 編輯正在處理的連接時,正是這種類型的更改。

與每個連接有關的數據(包括類型數據)通過外部數據源持久保存。

到目前為止我的解決方案

我有一個抽象類Connection帶有一些派生類型,例如TcpUsb等,它們具有抽象類的通用方法和屬性(例如AddressOpen()等),但實現方式不同,以獲取不同的數據和地址格式以VISA介面的正確格式。

該應用程序首先從數據源填充List<Connection> 在此List上是從Connection派生的類型的對象。

為用戶提供選擇列表中的一個連接時允許更改類型的控件,但仍保持通用的用法,該表單具有RadioButton控件,該控件由一種方法創建,該方法使用反射來查找生成每個對象的一個​​對象派生的類, 並使用通用的CheckedChanged事件處理程序將它們的名稱添加到表單中。

例如:

ConnectionIEnumerable = GetObjectsDerivedFromType<Connection>();
foreach (Connection c in ConnectionIEnumerable)
{
     var rb = new RadioButton();
     rb.Name = c.ToString() + "RadioButton";
     rb.CheckedChanged += new EventHandler(CommonEventHandler);
     form1.flowLayoutPanel1.Controls.Add(rb);
}

我被困在哪里

如何使用此通用處理程序“知道”將當前選定對象轉換為哪種類型? RadioButton如何存儲和傳遞有關應轉換為相關類型的信息?

我看了想這個計划的其他方式,但它總是回來,在某個時候將需要某種形式的要求, if檢查當前的類型轉換,或檢查的類型轉換為,從而引入非普遍性。

我認為OOP封裝的方式是在創建每個RadioButton某種方式將類型信息與它們關聯起來,並讓類型本身定義如何在它們之間進行轉換,但是我不確定這是否正確,或者是最好的方法這樣做; 使用IConvertible轉換,類型轉換器, IConvertible等。這樣處理程序可以使用以下內容(僅作為示例)來替換List上的對象:

    currentObject.ConvertTo( (Type)( (RadioButton)sender).Tag ) );

更新:

對於遇到類似難題的人,我接受了Patrick Hoffman的回答,並將類型信息保存到RadioButton.Tag如下所示:

rb.Tag = c.GetType()

然后在處理程序中使用它,例如:

EditedConnection = (Connection)Activator.CreateInstance((Type)((RadioButton)sender).Tag);

如何使用此通用處理程序“知道”將當前選定對象轉換為哪種類型?

它不需要知道這一點。 如果您的程序僅依賴於抽象基類,則您唯一需要做的就是一次實例化類型,並在整個程序中使用基類。

如果需要構造實例,則需要Activator.CreateInstance(Type) 您可以從之前填充列表的反射中檢索類型。

暫無
暫無

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

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