如何将匿名类型转换为IListSource、IEnumerable或IDataSource



我创建了以下anonymous type:

  int group_id = 0;
  int dep_code = 0;
  int dep_year = 0;
  string dep_name = string.Empty;
  int boss_num = 0;
  string boss_name = string.Empty;
  var list =  new  { group_id = group_id, dep_code = dep_code, dep_year = dep_year, dep_name = dep_name, boss_num = boss_num, boss_name = boss_name };

如何转化为IListSource, IEnumerable, or IDataSource. ??

如果您只想创建一个具有单个值的序列,则可以使用隐式类型数组:

int group_id = 0;
int dep_code = 0;
int dep_year = 0;
string dep_name = string.Empty;
int boss_num = 0;
string boss_name = string.Empty;
var list =  new[] { 
    new { group_id, dep_code, dep_year, dep_name, boss_num, boss_name }
};

注意,这里使用了投影初始化式,其中属性名是从表达式中推断出来的。

强烈建议您为变量使用常规名称,例如groupId。此外,dep在这里的意思也不清楚-如果这是一个缩写,您可能需要将其展开以使其清晰。


注意

根据我的问题中一些原始海报的评论,这个问题是关于。net Framework 3.5的。我自己给这个问题重新贴上了标签。无论如何,我把这个答案留在这里,因为它可能在未来对原始海报和未来的访问者有用。


不使用匿名对象,为什么不使用ExpandoObject呢?

dynamic list = new ExpandoObject();
list.group_id = group_id;
list.dep_code = dep_code;
// ... and so on.

一个重要的细节是ExpandoObject实现了IDictionary<string, object>,而IDictionary<string, object>将有一个Values属性,它实现了IEnumerable<T> !

IEnumerable<object> items = ((IDictionary<string, object>)list).Values;

更新

既然我看到Jon Skeet的答案对你来说是正确的,我猜你是在寻找一个匿名对象列表,而不是一个匿名对象变成了"enumerable" (从你的问题中知道什么对你是好的并不容易…我不打算删除我的答案,所以任何其他访问者寻找像我的第一理解一样的东西仍然可以发现我的答案非常有用)。

现在,为了更好地理解你的问题,你还可以这样做:

// Create a list of objects and you got it!
List<object> list = new List<object>();
list.Add(new { group_id, dep_code, dep_year, dep_name, boss_num, boss_name });

最新更新