我怎么能转换一个DataTable成一个动态的对象吗? [英] How can I convert a DataTable into a Dynamic object?

查看:144
本文介绍了我怎么能转换一个DataTable成一个动态的对象吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我怎么能转换数据表的IEnumerable< dynamicObject>



例如,我要转换的任何数据表

  ID |输入(DI)|林二汶
--------- ---------或
1 | ×2 | X
2 | Y 1 | Ÿ

在对象



<$ P列表$ p> //列表1(前1)//列表2(前2)
{{
{ID = 1,名称=X} {DI = 2 ,林二汶=X}
{ID = 2,名称=Y} {DI = 1,林二汶=Y}
}}

所以

  list1.First()。ID // 1 
list2.First()。林二汶//X

如何能我这样做呢?


解决方案

如何使用的 DynamicObject

 公共静态类DataTableX 
{
公共静态的IEnumerable<动态> 。AsDynamicEnumerable(此数据表表)
{
//验证的说法在这里..

返回table.AsEnumerable()选择(行=>新建DynamicRow(行));
}

私人密封类DynamicRow:DynamicObject
{
私人只读的DataRow _row;

内部DynamicRow(DataRow的行){_row =行; }

//解释一个成员访问作为//包含在DataRow的
索引器访问。
公众覆盖布尔TryGetMember(GetMemberBinder粘结剂,out对象结果)
{
VAR retVal的= _row.Table.Columns.Contains(binder.Name);
结果= retVal的? _row [binder.Name]:空;
返回retVal的;
}
}
}

您也可以尝试重写< 。code> TrySetMember 如果您希望动态行写



用法

  DataTable的表= ... 
VAR dynamicTable = table.AsDynamicEnumerable();

VAR firstRowsNameField = dynamicTable.First()名称。


How can I convert a DataTable in IEnumerable<dynamicObject>?

For example, I want to convert any DataTable

ID | Name          DI | emaN
---------    or    ---------
 1 | x              2 | x
 2 | y              1 | y

In a list of objects

// list 1      (ex 1)             // list 2    (ex 2)
{                                 {
  { ID = 1, Name = "x" }            { DI = 2, emaN = "x" }
  { ID = 2, Name = "y" }            { DI = 1, emaN = "y" }
}                                 }

So

list1.First().ID    // 1
list2.First().emaN  // "x"

How can I do it?

解决方案

How about with DynamicObject:

public static class DataTableX
{
    public static IEnumerable<dynamic> AsDynamicEnumerable(this DataTable table)
    {
        // Validate argument here..

        return table.AsEnumerable().Select(row => new DynamicRow(row));
    }

    private sealed class DynamicRow : DynamicObject
    {
        private readonly DataRow _row;

        internal DynamicRow(DataRow row) { _row = row; }

        // Interprets a member-access as an indexer-access on the 
        // contained DataRow.
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            var retVal = _row.Table.Columns.Contains(binder.Name);
            result = retVal ? _row[binder.Name] : null;
            return retVal;
        }
    }
}

You could also try overriding TrySetMember if you wish to make the dynamic-row writable.

Usage:

  DataTable table = ...
  var dynamicTable = table.AsDynamicEnumerable();

  var firstRowsNameField = dynamicTable.First().Name;

这篇关于我怎么能转换一个DataTable成一个动态的对象吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆