2012-11-26 53 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的)。