我們有一個裝箱的字串串列:
object myList = new List<string> { "str1", "str2" };
我們要使用String.Join和獲取"str1,str2". 如果我們這樣做
String.Join(",",myList)
它System.Collections.Generic.List`1[System.String]反而回傳。我們如何在不改變宣告的情況下處理這個問題myList?
這只是一個具體的例子。型別不一定總是List<string>,我們需要做myList.GetType()才能獲取該資訊。
uj5u.com熱心網友回復:
如果您不知道裝箱集合的型別,您可以撰寫一個輔助方法來取消裝箱并加入它:
public string UnboxAndJoin(string separator, object obj)
{
if (obj is IEnumerable enumerable)
{
return string.Join(separator, enumerable.Cast<object>());
}
else
{
throw new ArgumentException("Object is not an IEnumerable");
}
}
用法:
object myList = new List<string> { "str1", "str2" };
Console.WriteLine(UnboxAndJoin(",", myList)); // str1,str2
uj5u.com熱心網友回復:
你得到了System.Collections.Generic.List`1[System.String],這就是你的情況的預期結果。
多載解決方案String.Join是在您的情況下選擇以下多載:
public static string Join (string? separator, params object?[] values);
如此處所述,該Object.ToString()方法在引數的每個物件上values呼叫。檔案中的參考:
陣列中每個物件的字串表示形式是通過呼叫該物件的 ToString 方法派生的。
引數中的唯一物件values是類的實體List<string>。此類不會覆寫類中ToString()定義的基本實作,因此在類本身的任何實體上呼叫Object時都會回傳類的完全限定名稱。ToString()
這就是為什么您將字串System.Collections.Generic.List`1[System.String]作為代碼的輸出。
如果您想要的輸出是 string "str1,str2",那么String.Join您真正想要呼叫的多載如下:
public static string Join (string? separator, System.Collections.Generic.IEnumerable<string?> values);
為了呼叫此多載,您需要將myList變數向下轉換為List<string>型別:
String.Join(",", (List<string>) myList)
如果不知道myList變數中物件的實際型別,您可以采取防御措施并執行以下操作:
if (myList is IEnumerable<string> values)
{
var message = String.Join(",", values);
Console.WriteLine(message);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/462714.html
上一篇:從Unity中的介面序列化屬性
