using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Threading; using System.Reflection; using System.Reflection.Emit; namespace WmData { /// /// This object is like a cache for the Reflection logic /// in the Data system. It uses the System.Reflection.Emit namespace; /// Created 10th of july 2009 /// public class WmIntermediateObject { protected Type objectType; protected string name; protected string tableName; protected DataTable dataTable; protected object dataTableLockObject = new object(); protected CreateInstanceHandler creator; protected List properties; protected WmIntermediateObjectProperty idProperty; protected WmDataBaseCredentials databaseCredentials; public WmIntermediateObject(Type objectType, WmDataBaseCredentials databaseCredentials) { this.objectType = objectType; name = objectType.Name; tableName = WmDataTools.getTableName(objectType); creator = WmIntermediateObjectTools.GetInstanceCreator(objectType); this.databaseCredentials = databaseCredentials; properties = new List(); foreach (PropertyInfo propInfo in objectType.GetProperties()) { if (WmDataTools.checkDataNeed(propInfo.PropertyType)) { WmIntermediateObjectProperty property = new WmIntermediateObjectProperty(propInfo); properties.Add(property); } } } public int getObjectInstanceId(object objectInstance) { return (int) IdProperty.Getter(objectInstance); } public string Name { get { return name; } } public string TableName { get { return tableName; } } public Type ObjectType { get { return objectType; } } public CreateInstanceHandler Creator { get { return creator; } } public WmIntermediateObjectProperty IdProperty { get { if (idProperty == null) { idProperty = getProperty("Id"); } return idProperty; } } public List Properties { get { return properties; } } public WmIntermediateObjectProperty getProperty(string propertyName) { foreach (WmIntermediateObjectProperty property in properties) { if (property.Name.Equals(propertyName, StringComparison.OrdinalIgnoreCase)) { return property; } } return null; } public DataTable DataTable{ get { using (TimedLock.Lock(this.dataTableLockObject)) { if (dataTable == null && databaseCredentials != null) { dataTable = WmDataBaseCreator.getDataTable(objectType, databaseCredentials); return dataTable.Clone(); } else { if (dataTable != null) { return dataTable.Clone(); } else { return null; } } } } } } public class WmIntermediateObjectProperty { protected PropertyInfo info; protected string name; protected string dataName; protected Type type; protected int dataColumnIndex = -1; protected PropertyGetHandler getter; protected PropertySetHandler setter; public WmIntermediateObjectProperty(PropertyInfo propertyInfo) { this.info = propertyInfo; this.name = propertyInfo.Name; this.dataName = propertyInfo.Name.ToLower(); this.type = propertyInfo.PropertyType; this.getter = WmIntermediateObjectTools.GetPropertyGetter(propertyInfo); this.setter = WmIntermediateObjectTools.GetPropertySetter(propertyInfo); } public int DataColumnIndex { get { return dataColumnIndex; } set { dataColumnIndex = value; } } public PropertyInfo Info { get { return info; } } public string Name { get { return name; } } public string DataName { get { return dataName; } } public Type Type { get { return type; } } public PropertyGetHandler Getter { get { return getter; } } public PropertySetHandler Setter { get { return setter; } } public object parseValueFromString(string value) { if (value != null && value.Equals("##NULL##")) { return null; } else { if (type.Equals(typeof(int))) { return int.Parse(value); } else if (type.Equals(typeof(double))) { return double.Parse(value); } else if (type.Equals(typeof(long))) { return long.Parse(value); } else if (type.Equals(typeof(bool))) { if (value.Equals("0") || value.ToLower().Equals("false")) { return false; } else { return true; } } else if (type.Equals(typeof(DateTime))) { return DateTime.Parse(value); } else if (type.Equals(typeof(string))) { return (string)value; } else { return value; } } } } }