Beispiel #1
0
        /// <summary>
        /// <see cref="ConvertAll{TEntity}(IDataReader,INameMap)"/>와는 반대로,
        /// Persistent Object의 속성정보를 DbCommand Parameter Value로 설정한다.
        /// </summary>
        /// <param name="db">instance of <see cref="Database"/> defined in DAAB</param>
        /// <param name="cmd">instance of DbCommand</param>
        /// <param name="entity">Command로 실행할 Persistent object</param>
        /// <param name="nameMaps">DbCommand 인자명 : Persistent Object 속성명의 매핑 정보</param>
        /// <param name="ignoreCase">컬럼명과 속성명의 대소문자 구분없이 매칭합니다.</param>
        public static void SetParameterValues <T>(this Database db, DbCommand cmd, T entity, INameMap nameMaps, bool ignoreCase = true)
        {
            cmd.ShouldNotBeNull("cmd");
            entity.ShouldNotBeNull("entity");
            nameMaps.ShouldNotBeNull("nameMaps");

            var accessor      = DynamicAccessorFactory.CreateDynamicAccessor <T>(true);
            var propertyNames = accessor.GetPropertyNames();

            if (IsDebugEnabled)
            {
                log.Debug("대상 Entity의 속성명 정보=[{0}]", propertyNames.CollectionToString());
            }

            var parameters = new List <IAdoParameter>();

            foreach (string paramName in nameMaps.Keys)
            {
                // remove parameter prefix
                var pName = paramName.RemoveParameterPrefix();

                var propertyName = propertyNames.FirstOrDefault(pn => pn.EqualTo(nameMaps[pName], ignoreCase));

                if (propertyName.IsNotWhiteSpace())
                {
                    parameters.Add(new AdoParameter(pName, accessor.GetPropertyValue(entity, propertyName)));
                }
            }

            SetParameterValues(db, cmd, parameters.ToArray());
        }
        /// <summary>
        /// Castle.Windsor 환경설정 정보에 있는 속성정보를 Instance의 속성 값으로 매핑한다.
        /// </summary>
        /// <param name="configuration">Castle configuration object</param>
        /// <param name="targetType">target type</param>
        /// <returns></returns>
        public override object PerformConversion(IConfiguration configuration, Type targetType)
        {
            configuration.ShouldNotBeNull("configuration");
            targetType.ShouldNotBeNull("targetType");

            if (IsDebugEnabled)
            {
                log.Debug("Perform conversion configuration value to property. configuration={0}, targetType={1}",
                          configuration, targetType);
            }

            var instance = ActivatorTool.CreateInstance(targetType);

            var accessor = DynamicAccessorFactory.CreateDynamicAccessor(targetType, false);

            const BindingFlags flags = BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;

            foreach (var itemConfig in configuration.Children)
            {
                var propInfo = targetType.GetProperty(itemConfig.Name, flags);

                // convert from string to object
                var value = Context.Composition.PerformConversion(itemConfig.Value, propInfo.PropertyType);
                accessor.SetPropertyValue(instance, itemConfig.Name, value);
            }
            return(instance);
        }
Beispiel #3
0
        /// <summary>
        /// 지정된 엔티티와 속성들을 <see cref="NHibernateUtil.Initialize"/>를 이용하여 초기화 합니다. ( proxy 값을 실제 값으로 대체한다는 소리!!!)
        /// </summary>
        /// <typeparam name="T">초기화할 엔티티의 수형</typeparam>
        /// <param name="entity">초기화할 엔티티</param>
        /// <param name="forceInitialize">강제 초기화</param>
        /// <returns>초기화된 엔티티</returns>
        public static T InitializeEntity <T>(this T entity, bool forceInitialize) where T : IDataObject
        {
            // NOTE : IsInitialized, IsPropertyInitialized 가 제대로 수행되지 않는다. 그래서 무조건 항상 Initialize를 수행하도록 했다.

            if (forceInitialize == false && NHibernateUtil.IsInitialized(entity))
            {
                return(entity);
            }

            if (IsDebugEnabled)
            {
                log.Debug("NHibernate 엔티티를 Initialize하여 Proxy에서 실제 Data를 로딩하도록 합니다... entity=[{0}]", entity);
            }

            var dynamicAccessor = DynamicAccessorFactory.CreateDynamicAccessor <T>(true);
            var propertyNames   = dynamicAccessor.GetPropertyNames();

            NHibernateUtil.Initialize(entity);

            foreach (var propertyName in propertyNames)
            {
                if (forceInitialize || NHibernateUtil.IsPropertyInitialized(entity, propertyName) == false)
                {
                    NHibernateUtil.Initialize(dynamicAccessor.GetPropertyValue(entity, propertyName));
                }
            }

            return(entity);
        }
        public void GetAllFields_By_Generic()
        {
            var widget   = new Widget(1, "Widget No1");
            var accessor = DynamicAccessorFactory.CreateDynamicAccessor <Widget>();
            var fields   = accessor.GetFieldNameValueCollection(widget).ToDictionary(pair => pair.Key, pair => pair.Value);

            VerifyFieldCollection(fields);
        }
        public void GetAllProperties_By_Generic()
        {
            var widget     = new Widget(1, "Widget No1");
            var accessor   = DynamicAccessorFactory.CreateDynamicAccessor <Widget>();
            var properties = accessor.GetPropertyNameValueCollection(widget).ToDictionary(pair => pair.Key, pair => pair.Value);

            VerifyPropertyCollection(properties);
        }
Beispiel #6
0
        protected virtual void DoSetupCommand(DbCommand cmd)
        {
            //  NOTE: Oracle 인 경우 다음과 같은 코드가 추가되어야 한다.

            var accessor = DynamicAccessorFactory.CreateDynamicAccessor <DbCommand>(MapPropertyOptions.Safety);

            accessor.SetPropertyValue(cmd, "BindByName", true);
        }
        public void SetFieldByDynamicMethodWithIgnoreCase()
        {
            using (new OperationTimer("Set Field value by dynamic method with IgnoreCase")) {
                var accessor = DynamicAccessorFactory.CreateDynamicAccessor <Widget>(false, true);

                foreach (var widget in _widgets)
                {
                    accessor.SetFieldValue(widget, "_ID", widget.Id);
                    accessor.SetFieldValue(widget, "_NAME", widget.Name);
                    accessor.SetFieldValue(widget, "_GUID", widget.Guid);
                }
            }
        }
        public void SetFieldByDynamicMethod()
        {
            using (new OperationTimer("Set Field value by dynamic method")) {
                var accessor = DynamicAccessorFactory.CreateDynamicAccessor <Widget>();

                foreach (var widget in _widgets)
                {
                    accessor.SetFieldValue(widget, "_id", widget.Id);
                    accessor.SetFieldValue(widget, "_name", widget.Name);
                    accessor.SetFieldValue(widget, "_guid", widget.Guid);
                }
            }
        }
        public void GetFieldNames()
        {
            var accessor = DynamicAccessorFactory.CreateDynamicAccessor <Widget>();

            var fieldNames = accessor.GetFieldNames();

            Assert.IsTrue(fieldNames.Count > 0);
            Assert.IsTrue(fieldNames.Contains("_id"));
            Assert.IsTrue(fieldNames.Contains("_name"));

            var customFieldNames = accessor.GetFieldNames(BindingFlags.Public | BindingFlags.Instance);

            Assert.AreEqual(0, customFieldNames.Count);
        }
Beispiel #10
0
        /// <summary>
        ///  지정된 컬렉션의 엔티티와 속성들을 <see cref="NHibernateUtil.Initialize"/>를 이용하여 초기화 합니다. ( proxy 값을 실제 값으로 대체한다는 소리!!!)
        /// </summary>
        /// <typeparam name="T">엔티티 수형</typeparam>
        /// <param name="entities">엔티티 시퀀스</param>
        /// <param name="forceInitialize">Initialize가 되었던 안되었던 강제로 초기화를 합니다.</param>
        /// <returns>초기화된 엔티티 컬렉션</returns>
        public static IList <T> InitializeEntities <T>(this IList <T> entities, bool forceInitialize)
        {
            if (NHibernateUtil.IsInitialized(entities) && forceInitialize == false)
            {
                return(entities);
            }

            if (IsDebugEnabled)
            {
                log.Debug("NHibernate 엔티티 컬렉션을 Initialize하여 Proxy에서 실제 Data를 로딩하도록 합니다... forceInitialized=[{0}]", forceInitialize);
            }

            var dynamicAccessor = DynamicAccessorFactory.CreateDynamicAccessor <T>(true);
            var propertyNames   = dynamicAccessor.GetPropertyNames();

            NHibernateUtil.Initialize(entities);

            var ignorePropertyNames = new List <string>();

            foreach (T item in entities)
            {
                if (forceInitialize || NHibernateUtil.IsInitialized(item) == false)
                {
                    NHibernateUtil.Initialize(item);

                    foreach (var propertyName in propertyNames)
                    {
                        if (ignorePropertyNames.Contains(propertyName))
                        {
                            continue;
                        }

                        var propertyType = dynamicAccessor.PropertyMap[propertyName].PropertyType;
                        if (propertyType.IsSimpleType())
                        {
                            ignorePropertyNames.Add(propertyName);
                            continue;
                        }

                        if (forceInitialize || NHibernateUtil.IsPropertyInitialized(item, propertyName) == false)
                        {
                            NHibernateUtil.Initialize(dynamicAccessor.GetPropertyValue(item, propertyName));
                        }
                    }
                }
            }

            return(entities);
        }
        private static void GenerateXmlAttributes <T>(XmlWriter writer, IDynamicAccessor accessor, T instance) where T : IChartObject
        {
            foreach (var propertyName in accessor.GetPropertyNames())
            {
                var propertyValue = accessor.GetPropertyValue(instance, propertyName);
                if (propertyValue != null)
                {
                    Type propertyType = accessor.GetPropertyType(propertyName);

                    if (propertyType.IsSimpleType() || propertyType.IsValueType)
                    {
                        if (IsDebugEnabled)
                        {
                            log.Debug("Property name={0}, type={1}, value={2}", propertyName, propertyType, propertyValue);
                        }

                        // NOTE : Color인 경우는 HexString으로, Enum 값은 HashCode 값으로...
                        if (propertyType == typeof(Color?))
                        {
                            var color = (Color?)propertyValue;
                            writer.WriteAttributeString(propertyName, color.Value.ToHexString());
                        }
                        else if (propertyType.IsEnum)
                        {
                            writer.WriteAttributeString(propertyName, propertyValue.GetHashCode().ToString());
                        }
                        else
                        {
                            writer.WriteAttributeString(propertyName, propertyValue.ToString());
                        }
                    }
                    else if (propertyType.IsSameOrSubclassOf(typeof(ChartAttributeBase)))
                    {
                        var accessor2 = DynamicAccessorFactory.CreateDynamicAccessor(propertyType, false);
                        GenerateXmlAttributes(writer, accessor2, propertyValue as ChartAttributeBase);
                    }
                    else if (TypeTool.IsSameOrSubclassOrImplementedOf(propertyType, typeof(IEnumerable)))
                    {
                        // Nothing to do.
                    }
                    else
                    {
                        throw new NotSupportedException(string.Format("지원하지 않는 속성입니다.  property name={0}, type={1}", propertyName,
                                                                      propertyType.FullName));
                    }
                }
            }
        }
        public void GetPropertyByDynamicMethodWithIgnoreCase()
        {
            using (new OperationTimer("Get Property by Dynamic Method with IgnoreCase")) {
                var accessor = DynamicAccessorFactory.CreateDynamicAccessor <Widget>(false, true);

                foreach (var widget in _widgets)
                {
                    var id   = (int)accessor.GetPropertyValue(widget, "ID");
                    var name = (string)accessor.GetPropertyValue(widget, "NAME");
                    var guid = (Guid)accessor.GetPropertyValue(widget, "GUID");

                    Assert.AreEqual(widget.Id, id);
                    Assert.AreEqual(widget.Name, name);
                    Assert.AreEqual(widget.Guid, guid);
                }
            }
        }
        public void GetPropertyByDynamicMethodAndParallel()
        {
            using (new OperationTimer("Get Property by Dynamic Method and Parallel Programming")) {
                var accessor = DynamicAccessorFactory.CreateDynamicAccessor <Widget>();

                foreach (var widget in _widgets.AsParallel())
                {
                    var id   = (int)accessor.GetPropertyValue(widget, "Id");
                    var name = (string)accessor.GetPropertyValue(widget, "Name");
                    var guid = (Guid)accessor.GetPropertyValue(widget, "Guid");

                    Assert.AreEqual(widget.Id, id);
                    Assert.AreEqual(widget.Name, name);
                    Assert.AreEqual(widget.Guid, guid);
                }
            }
        }
        public void GetPropertyNames()
        {
            var accessor = DynamicAccessorFactory.CreateDynamicAccessor <Widget>();

            var propertyNames = accessor.GetPropertyNames();

            Assert.IsTrue(propertyNames.Count > 0);
            Assert.IsTrue(propertyNames.Contains("Id"));
            Assert.IsTrue(propertyNames.Contains("Name"));

            var customPropertyNames =
                accessor.GetPropertyNames(BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty);

            Assert.IsTrue(customPropertyNames.Count > 0);
            Assert.IsTrue(propertyNames.Contains("Id"));
            Assert.IsTrue(propertyNames.Contains("Name"));
        }
        /// <summary>
        /// 제공하는 PerformanceCounter를 등록합니다.
        /// </summary>
        /// <param name="provider">PerformanceCounter 제공자</param>
        private static void RegistPerformanceCounter(IPerformanceCounterProvider provider)
        {
            provider.ShouldNotBeNull("provider");

            if (IsDebugEnabled)
            {
                log.Debug("해당 Provider의 PerformanceCounter 들을 생성합니다... CategoryName=[{0}]", provider.CategoryName);
            }

            var accessor = DynamicAccessorFactory.CreateDynamicAccessor(provider.GetType(), true);

            foreach (var propName in accessor.GetPropertyNames())
            {
                if (accessor.GetPropertyType(propName) == typeof(PerformanceCounter))
                {
                    provider.PerformanceCounters.Add((PerformanceCounter)accessor.GetPropertyValue(provider, propName));
                }
            }
        }
        public void GetFieldByDynamicMethodWithIgnoreCase()
        {
            int    id;
            string name;
            Guid   guid;

            using (new OperationTimer("Get Field by Dynamic Method with IgnoreCase")) {
                var accessor = DynamicAccessorFactory.CreateDynamicAccessor <Widget>(false, true);

                foreach (var widget in _widgets)
                {
                    id   = (int)accessor.GetFieldValue(widget, "_ID");
                    name = (string)accessor.GetFieldValue(widget, "_NAME");
                    guid = (Guid)accessor.GetFieldValue(widget, "_GUID");

                    Assert.AreEqual(id, widget.Id);
                    Assert.AreEqual(name, widget.Name);
                    Assert.AreEqual(guid, widget.Guid);
                }
            }
        }
        public void GetFieldByDynamicMethod()
        {
            int    id;
            string name;
            Guid   guid;

            using (new OperationTimer("Get Field by Dynamic Method")) {
                var accessor = DynamicAccessorFactory.CreateDynamicAccessor <Widget>();

                foreach (var widget in _widgets)
                {
                    id   = (int)accessor.GetFieldValue(widget, "_id");
                    name = (string)accessor.GetFieldValue(widget, "_name");
                    guid = (Guid)accessor.GetFieldValue(widget, "_guid");

                    Assert.AreEqual(id, widget.Id);
                    Assert.AreEqual(name, widget.Name);
                    Assert.AreEqual(guid, widget.Guid);
                }
            }
        }
Beispiel #18
0
        /// <summary>
        /// 인스턴스의 특정 속성들로부터 HashCode를 생성합니다.
        /// </summary>
        /// <typeparam name="T">대상 객체의 수형</typeparam>
        /// <param name="target">해시코드를 얻고자하는 대상 객체</param>
        /// <param name="propertyExprs">해시코드 조합용 속성들</param>
        /// <returns></returns>
        public static int CalcHash <T>(this T target, params Expression <Func <T, object> >[] propertyExprs)
        {
            if (Equals(target, default(T)))
            {
                return(0);
            }

#if !SILVERLIGHT
            if (propertyExprs == null || propertyExprs.Length == 0)
            {
                return(target.GetHashCode());
            }

            var propertyNames = propertyExprs.Select(expr => expr.Body.FindMemberName()).ToArray();
            var accessor      = DynamicAccessorFactory.CreateDynamicAccessor <T>(MapPropertyOptions.Safety);

            return(Compute(propertyNames.Select(name => accessor.GetPropertyValue(target, name)).ToArray()));
#else
            return(target.GetHashCode());
#endif
        }
        public void SetPropertyByDynamicMethodAndParellel()
        {
            using (new OperationTimer("Set Property value by Dynamic method and Parallel")) {
                var accessor = DynamicAccessorFactory.CreateDynamicAccessor <Widget>();

                _widgets
                .AsParallel()
                .RunEach(widget => {
                    var id   = widget.Id;
                    var name = widget.Name + " by SetPropertyValue";
                    var guid = Guid.NewGuid();
                    accessor.SetPropertyValue(widget, "Id", id);
                    accessor.SetPropertyValue(widget, "Name", name);
                    accessor.SetPropertyValue(widget, "Guid", guid);

                    Assert.AreEqual(id, widget.Id);
                    Assert.AreEqual(name, widget.Name);
                    Assert.AreEqual(guid, widget.Guid);
                });
            }
        }
        public void TryGetFieldByDynamicMethod()
        {
            object id, name, guid;

            using (new OperationTimer("TryGetFieldValue by Dynamic Method")) {
                var accessor = DynamicAccessorFactory.CreateDynamicAccessor <Widget>(true, true);

                foreach (var widget in _widgets)
                {
                    Assert.IsTrue(accessor.TryGetFieldValue(widget, "_id", out id));
                    Assert.IsTrue(accessor.TryGetFieldValue(widget, "_name", out name));
                    Assert.IsTrue(accessor.TryGetFieldValue(widget, "_guid", out guid));

                    object notExists;
                    Assert.IsFalse(accessor.TryGetFieldValue(widget, "_notExistField", out notExists));

                    Assert.AreEqual(id, widget.Id);
                    Assert.AreEqual(name, widget.Name);
                    Assert.AreEqual(guid, widget.Guid);
                }
            }
        }
        public void SetPropertyByDynamicMethodWithIgnoreCase()
        {
            using (new OperationTimer("Set Property value by Dynamic method with IgnoreCase")) {
                var accessor = DynamicAccessorFactory.CreateDynamicAccessor <Widget>(() => new DynamicAccessor <Widget>(false, true));

                foreach (var widget in _widgets)
                {
                    var id   = widget.Id;
                    var name = widget.Name + " by SetPropertyValue";
                    var guid = Guid.NewGuid();
                    accessor.SetPropertyValue(widget, "ID", id);
                    accessor.SetPropertyValue(widget, "NAME", name);
                    accessor.SetPropertyValue(widget, "GUID", guid);

                    Assert.AreEqual(id, widget.Id);
                    Assert.AreEqual(name, widget.Name);
                    Assert.AreEqual(guid, widget.Guid);
                }
            }

            using (new OperationTimer("Set Property value by Dynamic method with IgnoreCare")) {
                var accessor = DynamicAccessorFactory.CreateDynamicAccessor <Widget>(false, true);

                foreach (var widget in _widgets)
                {
                    var id   = widget.Id;
                    var name = widget.Name + " by SetPropertyValue";
                    var guid = Guid.NewGuid();
                    accessor.SetPropertyValue(widget, "ID", id);
                    accessor.SetPropertyValue(widget, "NAME", name);
                    accessor.SetPropertyValue(widget, "GUID", guid);

                    Assert.AreEqual(id, widget.Id);
                    Assert.AreEqual(name, widget.Name);
                    Assert.AreEqual(guid, widget.Guid);
                }
            }
        }
        public void GenerateXmlByDynamicAccessor()
        {
            var accessor2 = DynamicAccessorFactory.CreateDynamicAccessor(typeof(CosmeticAttribute), false);

            var cosmetic = new CosmeticAttribute
            {
                BgSWF = "~/FusionCharts/BgChart.swf"
            };

            var sb = new StringBuilder();

            using (var writer = new XmlTextWriter(new StringWriter(sb))) {
                writer.WriteStartDocument(true);
                writer.WriteStartElement("chart");

                GenerateXmlAttributes(writer, accessor2, cosmetic);

                writer.WriteEndElement();
                writer.WriteEndDocument();
            }

            Console.WriteLine(sb.ToString());
        }
Beispiel #23
0
            public static ResultRow ToResultRow(ResultEntity resultEntity)
            {
                var accessor = DynamicAccessorFactory.CreateDynamicAccessor <ResultEntity>();

                return(new ResultRow(accessor.GetPropertyNameValueCollection(resultEntity).ToDictionary(p => p.Key, p => p.Value)));
            }
Beispiel #24
0
 /// <summary>
 /// 지정된 수형의 속성, 필드를 동적으로 접근할 수 있도록 해주는 <see cref="IDynamicAccessor"/>를 생성합니다.
 /// </summary>
 /// <param name="type">대상 수형</param>
 /// <param name="mapOptions">매핑 옵션</param>
 internal static IDynamicAccessor GetDynamicAccessor(Type type, MapPropertyOptions mapOptions = null)
 {
     return(DynamicAccessorFactory.CreateDynamicAccessor(type, mapOptions ?? MapPropertyOptions.Safety));
 }
Beispiel #25
0
 static IndexableCollection()
 {
     Accessor      = DynamicAccessorFactory.CreateDynamicAccessor <T>(MapPropertyOptions.Safety);
     PropertyInfos = Accessor.PropertyMap.Values.ToArray();
     PropertyNames = Accessor.GetPropertyNames();
 }
Beispiel #26
0
 /// <summary>
 /// 수형 {T} 의 인스턴스의 속성 및 필드에 동적으로 접근할 수 있도록 해주는 <see cref="IDynamicAccessor{T}"/>를 생성합니다.
 /// </summary>
 /// <typeparam name="T">대상 수형</typeparam>
 /// <param name="mapOptions">매핑 옵션</param>
 /// <seealso cref="TypeConvertableDynamicAccessor{T}"/>
 internal static IDynamicAccessor <T> GetDynamicAccessor <T>(MapPropertyOptions mapOptions = null)
 {
     return(DynamicAccessorFactory.CreateDynamicAccessor <T>(mapOptions ?? MapPropertyOptions.Safety));
 }