我想創建一個要在繪圖對象上執行的動作列表。這裏的非通用代碼將是什麼樣子:C#模式來緩存接受通用參數的動作
private Dictionary<String, Action<Drawing, String>> actions = new Dictionary<String, Action<Drawing, String>>();
private void LoadActions()
{
actions.Add("Height", (d, s) => d.Height = Double.Parse(s));
actions.Add("Width", (d, s) => d.Width = Double.Parse(s));
}
private void ProcessDrawing(Drawing drawing, String prop, String value)
{
actions[prop](drawing, value);
}
我的問題是,繪圖類是通用的一個(Drawing<T>
),這樣因爲T沒有規定我不能這樣定義以下操作:
Dictionary<String, Action<Drawing<T>, String>> actions = new Dictionary<String, Action<Drawing<T>, String>>();
沒有緩存的代碼如下所示:
private void ProcessDrawing<T>(Drawing<T> drawing, String prop, String value)
{
var actions = new Dictionary<String, Action<Drawing<T>, String>>();
actions.Add("Height", (d, s) => d.Height = Double.Parse(s));
actions.Add("Width", (d, s) => d.Width = Double.Parse(s));
actions[prop](drawing, value);
}
所以,我怎麼可以緩存一堆接受泛型類型參數的行動?
感謝,
你能提供一個例子嗎?當我嘗試填充操作時出現以下錯誤:無法將lambda表達式轉換爲鍵入'System.MulticastDelegate',因爲它不是委託類型。我在執行操作檢查時也收到錯誤:actions.TryGetValue(prop,out action) – Manuel
我添加了一個示例。我還測試過,如果匿名委託可以直接傳遞給'Add()'方法,與lambda不同。但這裏又出現了同樣的問題。 –