Объект в DataView или DataSet или DataTable и обратно в объект - PullRequest
0 голосов
/ 15 декабря 2009

У нас есть приложение mish-mash с унаследованным модулем, которое по-прежнему использует DataSets, DataViews и DataTables, однако у нас есть большинство баз данных ORMed, кроме БД для этого модуля. Мне было интересно, если кто-то может дать мне советы о том, как строить расширения вроде

/* generates a dataset called CustomerDS with 
DataTable called Customer uses property names as DataColumn name */
var dataset =_customer.AsDataSet(); 
/* Converts the dataset to required object or 
throws exception if its cant convert*/
 var customerEntity = _dataset.ToObject<Customer>(); 

Я не знаю, когда у нас будет время поработать над другими слоями приложения и освободить его от DataSets. Я мог бы казаться сумасшедшим, но это просто мысль. Я получаю кошмары, когда мне нужно поддержать / исправить это приложение.

Ответы [ 2 ]

1 голос
/ 15 декабря 2009

Вы можете использовать отражение, например:

class Program {
        public static void Start( string[] args ) {
            var john = new Customer {
                CustomerID = Guid.NewGuid(),
                CustomerName = "John",
                CustomerCode = "J-O"
            };

            var tblJohn = john.ToDataTable();
            var clonedJohn = tblJohn.Rows[0].ToDataObject<Customer>();
        }
}

[AttributeUsage(AttributeTargets.Property)]
public class DataColumnAttribute : Attribute { }
public class Customer {
    [DataColumn]
    public Guid CustomerID { get; set; }

    [DataColumn]
    public string CustomerName { get; set; }

    [DataColumn]
    public string CustomerCode { get; set; }
}

public static class DataObjectExtensions {
    public static T ToDataObject<T>( this DataRow dataRow ) where T : new() {
        var dataObject = Activator.CreateInstance<T>();
        var tpDataObject = dataObject.GetType();

        foreach ( var property in tpDataObject.GetProperties() ) {
            var attributes = property.GetCustomAttributes( typeof( DataColumnAttribute ), true );
            if ( null != attributes && attributes.Length > 0 ) {
                if ( property.CanWrite ) {
                    DataColumn clm = dataRow.Table.Columns[property.Name];
                    if ( null != clm ) {
                        object value = dataRow[clm];
                        property.SetValue( dataObject, value, null );
                    }
                }
            }
        }

        return dataObject;
    }
    public static DataTable ToDataTable( this object dataObject ) {
        var tpDataObject = dataObject.GetType();

        DataTable tbl = new DataTable();
        DataRow dataRow = tbl.NewRow();
        foreach ( var property in tpDataObject.GetProperties() ) {
            var attributes = property.GetCustomAttributes( typeof( DataColumnAttribute ), true );
            if ( null != attributes && attributes.Length> 0 ) {
                if ( property.CanRead ) {
                    object value = property.GetValue( dataObject, null );
                    DataColumn clm = tbl.Columns.Add( property.Name, property.PropertyType );
                    dataRow[clm] = value;
                }
            }
        }

        tbl.Rows.Add( dataRow );
        tbl.AcceptChanges();
        return tbl;
    }
}
0 голосов
/ 14 августа 2013

Вы можете использовать это, чтобы получить объект из таблицы данных

 public static class Extensions
    {
        public static List<T> ToList<T>(this DataTable table) where T : new()
        {
            IList<PropertyInfo> properties = typeof(T).GetProperties().ToList();
            List<T> result = new List<T>();

            foreach (var row in table.Rows)
            {
                var item = CreateItemFromRow<T>((DataRow)row, properties);
                result.Add(item);
            }

            return result;
        }

        private static T CreateItemFromRow<T>(DataRow row, IList<PropertyInfo> properties) where T : new()
        {
            T item = new T();
            foreach (var property in properties)
            {
                if (property.PropertyType == typeof(System.DayOfWeek))
                {
                    DayOfWeek day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), row[property.Name].ToString());
                    property.SetValue(item,day,null);
                }
                else
                {
                    property.SetValue(item, row[property.Name], null);
                }
            }
            return item;
        }
    }

и используйте его вот так

List<Employee> lst = ds.Tables[0].ToList<Employee>();
...