2017-02-15 101 views
0

我需要字符串列表轉換爲對象的名單,但事情是我收到這個清單作爲一個對象,因爲它是一個參數,我不知道它是什麼類型。C#轉換對象列出<object>

這是接收參數的函數:

public static bool IsNotEmpty(object obj) 
{ 
    if (obj is ICollection) 
    { 
     IList<object> collection = (IList<object>)obj; // The cast throws error here 
     return IsNotEmpty(collection); 
    } 

    return true; 
} 

這是這一個使用一個:

public static bool IsNotEmpty<T>(IList<T> aList) 
{ 
    return aList != null && aList.IsNotEmpty(); 
} 

我能做些什麼,以強制轉換爲對象的名單,所以那麼我可以將它傳遞給另一個函數? (如果有一種方法)

+2

你爲什麼要IsNotEmptyString採取一個對象,而不是一個字符串? – EpicKip

+2

IsNotEmptyString是該功能的一個非常令人誤解的名字 – BugFinder

+0

對不起,我改變了功能,所以我可以在這裏顯示它! 現在它實際上轉換爲字符串列表。 – Tobi

回答

2
public static bool IsNotEmpty(object obj) 
    { 
     var collection = obj as ICollection; 
     return collection == null || collection.Count > 0; 
    } 
8

你在做什麼,我們所說的「XY問題」:你心裏有一個(錯誤)解決方案爲您的問題,你問你的錯誤的解決方法,而不是尋求解決你的實際問題。

你並不需要字符串列表轉換爲對象的名單擺在首位,所以沒有必要問該怎麼做。對您的問題的正確解決方案是:

static class MyExtensions 
{ 
    public static bool Any(this IEnumerable sequence) 
    { 
    if (sequence == null) 
     throw new ArgumentNullException ... etc ... 
    if (sequence is ICollection) 
     return ((ICollection)sequence).Any(); 
    foreach(object item in sequence) 
     return true; 
    return false; 
    } 
    public static bool Any(this ICollection collection) 
    { 
     if (collection == null) blah blah blah 
     return collection.Count > 0; 
    } 
} 

很好。現在你的方法是:

public static bool IsNotEmpty(object obj) 
{ 
    if (obj is IEnumerable) 
    return ((IEnumerable)obj).Any(); 
    else 
    return true; 
} 

這裏的想法是首先去收集,因爲這樣可以避免不必要地枚舉序列。這可能很昂貴。但是如果我們有一個包含項目但不是集合的序列,則列舉它的第一個元素。如果我們能夠成功地做到這一點,那麼它就不是空的;如果我們不能,那麼它是空的。

但更一般地說:您的方法的簽名是不幸的。如果可以避免的話,不要陷入第一時間手頭有object的情況。你是怎麼進入這種情況的?

+1

最後一段是我認爲最重要的一段。我真的很想知道爲什麼OP有一個'object'而不是某種類型的集合來處理。我懷疑這是真正應該解決的問題。 – TheInnerLight

+0

如果使用as-IsNotEmpty將會變短 –