2011-09-01 82 views
0

我有一個類似下面的通用方法。並且我檢查參數是否是IList,但是如何將參數轉換爲IList?將T轉換爲IList

public T myMethod<T>(T parameter) 
{ 
    //check if the parameter is a list 
    if (parameter IList && parameter.GetType().IsGenericType) 
    { 
     //How can I convert my parameter to an IList that supports IEnumerable interface? 
     // So i can do the following 
     foreach (var listObject in parameter) 
     { 
      // Do stuff 
     } 
    } 
} 
+0

您的if語句是否有效?你的意思是:如果(參數是IList ...?如果是,那麼你所要做的就是投它 –

+0

一個簡單的演員將會工作,但你只能得到作爲'object'參考的內容 –

回答

1

(parameter as IList)

我假設你不想只在所有情況下將參數限制爲IList

2

我覺得這段代碼將確保您的參數始終是一個

public T myMethod<T>(T parameter) where T:IList 
{ 
    // bla 
} 
3

我會做這樣的:

public T myMethod<T>(T parameter) where T : IEnumerable 

那麼你並不需要強制轉換或轉換任何東西,你可以直接做你的foreach :)

+2

甚至公共T myMethod(IEnumerable參數) – chrisaut

+0

爲什麼不只是將參數設置爲'IEnumerable'(或'IList')? –

2

我會

public IEnumerable<T> MyMethod<T>(IEnumerable<T> parameter) 
{ 
    .... 
} 

或者IList<T>如果你願意去。

你可以使用你的參數知道它是一個IEnumerable。這是最簡單的方式,它與框架的功能相匹配。

5

是的,Marnix的答案是正確的,你需要一個地方,否則你爲什麼需要一個泛型類型T?

但是,這裏有5種不同的可能性。

可能性1:

public void xxx<T>(IList<T> parameter) 
    { 
     foreach (var listObject in parameter) 
     { 
      // Do stuff 
     } 
    } 

可能性2:

public void xxx<T>(T parameter) where T : IList 
    { 
     foreach (var listObject in parameter) 
     { 
      // Do stuff 
     } 
    } 

可能性3:

public void xxx<T>(T parameter) 
    { 
     IList list = parameter as IList; 
     if (list != null) 
     { 
      foreach (var listObject in list) 
      { 
       // Do stuff 
      } 
     } 
     else 
     { 
      // ... 
     } 
    } 

可能性4:

public void xxx(IList parameter) 
    { 
     foreach (var listObject in list) 
     { 
      // Do stuff 
     } 
    } 

可能性5:

public void xxx(object parameter) 
    { 
     IList list = parameter as IList; 
     if (list != null) 
     { 
      foreach (var listObject in list) 
      { 
       // Do stuff 
      } 
     } 
     else 
     { 
      // ... 
     } 
    } 

另一個大問題:你爲什麼要使用的IList?如果你只需要枚舉,使用T的IEnumerable和IEnumerable,它將允許你使用更多的類型並有更大的靈活性。

+0

+1以顯示各種選項。 –