我對 C# 很陌生。目前我正在處理其他人留下的一些代碼,它可能以前從未作業過。有一種方法接受兩個字串值作為引數。
public void Update(string area, string value)
{
//Perform operation
}
上面的方法是這樣呼叫的,這導致 - “最佳多載方法匹配...”錯誤被拋出。動態值可以由 bool、int 和 string 組成。
public void UpdateAll(Dictionary<string, dynamic> values)
{
foreach (var entry in values)
{
Update(entry.Key, entry.Value);
}
}
我的解決方案是首先在 UpdateAll 方法中將 Dictionary<string, dynamic> 轉換為 Dictionary<string, string> ,如下所示,因為我認為它需要的更改最少。但是我收到錯誤“無法將型別'int'轉換為'string'”或“無法將型別'bool'轉換為'string'”
public void UpdateAll(Dictionary<string, dynamic> values)
{
var convertedValues = values.ToDictionary(row => (string) row.Key, row => (string) row.Value);
foreach (var entry in convertedValues)
{
Update(entry.Key, entry.Value);
}
}
解決和解決問題的最佳方法是什么?
uj5u.com熱心網友回復:
這里的問題是它dynamic在運行時可以是任何型別,而您(和編譯器)直到運行時才知道實際型別。看到這個
var values = new Dictionary<string, dynamic>();
values.Add("key1", 5);
values.Add("key2", true);
values.Add("key3", "value");
該代碼被很好地編譯和執行。字典的行為類似于 thisobject作為其值的型別引數。
因此,當您迭代此字典時,字典entry.Value的不同元素可能具有不同的型別:int, bool, string, 等等。而當 this 具有例如 typeint時,多載決議程序就找不到方法Update(string, int),因此發生例外。您可以通過簡單的呼叫將其轉換為字串來解決此問題ToString()。希望 .NET 中的所有型別都有ToString方法,因此它非常安全:
Update(entry.Key, entry.Value.ToString())
但要小心,entry.Value仍然可以null,以便先檢查null然后將其轉換為string.
解決此問題的另一種方法是對不同型別的方法進行多載,Update這些型別可以成為字典的一部分。如果您真的不知道字典可能包含什么,這不是很可行,但如果您確定知道型別并且它們不會經常擴展,這可能會很好。當然,如果可以撰寫不同版本的Update方法:
void Update(string area, string value) { ... }
void Update(string area, int value) { ... }
void Update(string area, bool value) { ... }
另外,我不知道您呼叫的客戶端代碼UpdateAll,但您也可以認為此字典具有object型別引數而不是dynamic. 行為將是相同的,但在物件的情況下,您可以從編譯器獲得有關ToString方法的幫助。
void UpdateAll(Dictionary<string, object> values)
請注意,這種宣告字典的方式(帶有object)不允許使用上述方法多載。
uj5u.com熱心網友回復:
就這樣做
Update(entry.Key, entry.Value.ToString());
警惕不會為 ToString() 創建預期表示的有趣型別。(例如,類通常只會給你一個哈希值。)
如果你只有基本型別,你應該沒問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/436889.html
上一篇:將字典串列變成單個字典
