2012-11-26 52 views
0

我想獲得一個列的平均值。我可以像這樣工作:使用未知對象類型?

  IEnumerable results = defaultView.Select(args); 
      Decimal amount = results.Cast<Fees>().Average(x => x.Fee); 

其中結果是System.Collections.Generic.List`1對象的集合。但結果並不總是相同的對象,因爲可能會返回其他內容。

它始終是沿x對象與每個5-10值的結構。

我希望的一種通用的方法來遍歷數據如結果[0] [2],但無法找到一種方法不使用強類型上面的例子中訪問此數據。有任何想法嗎?

+0

你可以將它們轉換爲'''dynamic''',但爲什麼放棄類型安全? – Jduv

回答

4

最好的辦法是爲那些不同類別之間共享的屬性創建接口:

public interface IHasFee 
{ 
    decimal Fee {get;} 
} 

然後,你可以這個接口適用於所有具有一個收費性質的類:

public class Fees : IHasFee 
{ 
    public decimal Fee {get;set;} 
} 


public class Charge : IHasFee 
{ 
    public decimal Fee {get;set;} 
} 
2

如果您需要在可能包含不同類型對象的集合中迭代某種類型的對象(例如Fees),請嘗試使用:Enumerable.OfType Method

IEnumerable results = defaultView.Select(args); 
Decimal amount = results.OfType<Fees>().Average(x => x.Fee); 

從MSDN:

Enumerable.OfType方法

篩選IEnumerable根據指定類型的元素。

的OfType(IEnumerable的)方法返回僅在該可轉換爲類型TResult 源的那些元素。爲了代替接收 異常,如果一個元素不能被轉換爲類型TResult,使用 角色(IEnumerable的)。