/// <summary>
        /// Implements the requested interface from supplied set of objects.
        /// </summary>
        /// <param name="interfaceType">An interface type to implement.</param>
        /// <param name="baseObjectTypes">Array of types which have all members of the given interface.
        /// When this parameter is set to null, the object type will be used.</param>
        /// <param name="objects">Array of objects which types expected to have all members of the given interface.</param>
        /// <param name="throwException">If true, throws an exception if object can not be created.</param>
        /// <returns>An object which implements the interface.</returns>
        public static object?Aggregate(this Type interfaceType, Type[]?baseObjectTypes, bool throwException, params object[] objects)
        {
            if (objects == null)
            {
                throw new ArgumentNullException(nameof(objects));
            }

            if (baseObjectTypes == null)
            {
                baseObjectTypes = new Type[objects.Length];

                for (var i = 0; i < objects.Length; i++)
                {
                    if (objects[i] != null)
                    {
                        baseObjectTypes[i] = objects[i].GetType();
                    }
                }
            }
            else
            {
                if (baseObjectTypes.Length != objects.Length)
                {
                    throw new ArgumentException("Invalid number of 'baseObjectTypes' or 'objects'.", nameof(baseObjectTypes));
                }

                for (var i = 0; i < objects.Length; i++)
                {
                    var objType = objects[i].GetType();

                    if (!baseObjectTypes[i].IsSameOrParentOf(objType))
                    {
                        throw new ArgumentException($"'{objType.FullName}' is not a subtype of '{baseObjectTypes[i].FullName}'.", nameof(objects));
                    }
                }
            }

            var duckType = GetDuckType(interfaceType, baseObjectTypes);

            if (duckType == null)
            {
                if (throwException)
                {
                    throw new TypeBuilderException($"Interface '{interfaceType}' cannot be implemented.");
                }
                return(null);
            }

            var duck = TypeAccessor.GetAccessor(duckType).CreateInstance();

            ((DuckType)duck).SetObjects(objects);

            return(duck);
        }
        /// <summary>
        /// Implements the requested interface for supplied object.
        /// If the supplied object implements the interface, the object itself will be returned.
        /// Otherwise a convenient duck object will be created.
        /// </summary>
        /// <param name="interfaceType">An interface type to implement.</param>
        /// <param name="baseObjectType">Any type which has all members of the given interface.
        /// When this parameter is set to null, the object type will be used.</param>
        /// <param name="obj">An object which type expected to have all members of the given interface.</param>
        /// <param name="throwException">If true, throws an exception if object can not be created.</param>
        /// <returns>An object which implements the interface.</returns>
        public static object?Implement(this Type interfaceType, Type?baseObjectType, object?obj, bool throwException)
        {
            if (obj == null)
            {
                throw new ArgumentNullException(nameof(obj));
            }

            var objType = obj.GetType();

            if (interfaceType.IsSameOrParentOf(objType))
            {
                return(obj);
            }

            if (obj is DuckType duckObject)
            {
                if (duckObject.Objects.Length == 1)
                {
                    // Switch to underlying objects when a duck object was passed.
                    //
                    return(Implement(interfaceType, baseObjectType, duckObject.Objects[0]));
                }

                // Re-aggregate underlying objects to expose new interface.
                //
                return(Aggregate(interfaceType, duckObject.Objects));
            }

            if (baseObjectType == null)
            {
                baseObjectType = objType;
            }
            else if (!baseObjectType.IsSameOrParentOf(objType))
            {
                throw new ArgumentException($"'{objType.FullName}' is not a subtype of '{baseObjectType.FullName}'.", nameof(obj));
            }

            var duckType = interfaceType.GetDuckType(baseObjectType);

            if (duckType == null)
            {
                if (throwException)
                {
                    throw new TypeBuilderException($"Interface '{interfaceType}' cannot be implemented.");
                }
                return(null);
            }

            var duck = TypeAccessor.GetAccessor(duckType).CreateInstance();

            ((DuckType)duck).SetObjects(obj);

            return(duck);
        }
        public EntityDescriptor(MappingSchema mappingSchema, Type type)
        {
            _mappingSchema = mappingSchema;

            TypeAccessor = TypeAccessor.GetAccessor(type);
            Associations = new List <AssociationDescriptor>();
            Columns      = new List <ColumnDescriptor>();

            Init();
            InitInheritanceMapping();
        }
Example #4
0
        /// <summary>
        /// Searches for the property using a property expression.
        /// </summary>
        /// <typeparam name="T">The object type containing the property specified in the expression.</typeparam>
        /// <param name="propertyExpression">The property expression (e.g. p => p.PropertyName)</param>
        /// <returns>An <see cref="IMemberAccessor"/> instance for the property if found; otherwise <c>null</c>.</returns>
        /// <exception cref="ArgumentNullException">Thrown if the <paramref name="propertyExpression"/> is null.</exception>
        /// <exception cref="ArgumentException">Thrown when the expression is:<br/>
        ///     Not a <see cref="MemberExpression"/><br/>
        ///     The <see cref="MemberExpression"/> does not represent a property.<br/>
        ///     Or, the property is static.
        /// </exception>
        public static IMemberAccessor FindProperty <T>(Expression <Func <T> > propertyExpression)
        {
            if (propertyExpression == null)
            {
                throw new ArgumentNullException("propertyExpression");
            }

            TypeAccessor typeAccessor = TypeAccessor.GetAccessor(typeof(T));

            return(typeAccessor.FindProperty <T>(propertyExpression));
        }
        public static IEqualityComparer <T> GetEqualityComparer <T>(
            [InstantHandle] Func <MemberAccessor, bool> memberPredicate)
        {
            if (memberPredicate == null)
            {
                throw new ArgumentNullException(nameof(memberPredicate));
            }

            var members = TypeAccessor.GetAccessor <T>().Members.Where(memberPredicate).ToList();

            return(new Comparer <T>(GetEqualsFunc <T>(members), GetGetHashCodeFunc <T>(members)));
        }
        public ShardConfig ShardStrategy <TShardStrategy>(object attributes) where TShardStrategy : IShardStrategy
        {
            var ta = TypeAccessor.GetAccessor(attributes.GetType());
            var d  = ta.GetFieldValueDictionary(attributes);
            var sd = new Dictionary <string, string>();

            foreach (KeyValuePair <string, object> entry in d)
            {
                sd.Add(entry.Key, entry.Value.ToString());
            }
            return(ShardStrategy <TShardStrategy>(sd));
        }
Example #7
0
        internal static void ParseSet(
            ExpressionBuilder builder,
            BuildInfo buildInfo,
            LambdaExpression extract,
            Expression update,
            IBuildContext select,
            List <SqlQuery.SetExpression> items)
        {
            var ext = extract.Body;

            if (!ExpressionHelper.IsConstant(update.Type) && !builder.AsParameters.Contains(update))
            {
                builder.AsParameters.Add(update);
            }

            while (ext.NodeType == ExpressionType.Convert || ext.NodeType == ExpressionType.ConvertChecked)
            {
                ext = ((UnaryExpression)ext).Operand;
            }

            if (ext.NodeType != ExpressionType.MemberAccess || ext.GetRootObject() != extract.Parameters[0])
            {
                throw new LinqException("Member expression expected for the 'Set' statement.");
            }

            var body   = (MemberExpression)ext;
            var member = body.Member;

            if (member is MethodInfo)
            {
                member = TypeHelper.GetPropertyByMethod((MethodInfo)member);
            }

            var column = select.ConvertToSql(
                body, 1, ConvertFlags.Field);

            //Expression.MakeMemberAccess(Expression.Parameter(member.DeclaringType, "p"), member), 1, ConvertFlags.Field);

            if (column.Length == 0)
            {
                throw new LinqException("Member '{0}.{1}' is not a table column.", member.DeclaringType.Name, member.Name);
            }

            var expr = builder.ConvertToSql(select, update, false, false);

            if (expr is SqlValueBase && TypeHelper.IsEnumOrNullableEnum(update.Type))
            {
                var memberAccessor = TypeAccessor.GetAccessor(body.Member.DeclaringType)[body.Member.Name];
                ((SqlValueBase)expr).SetEnumConverter(memberAccessor, builder.MappingSchema);
            }

            items.Add(new SqlQuery.SetExpression(column[0].Sql, expr));
        }
        public static IEqualityComparer <T> GetEqualityComparer <T>(
            [InstantHandle] Func <TypeAccessor <T>, IEnumerable <MemberAccessor> > membersToCompare)
        {
            if (membersToCompare == null)
            {
                throw new ArgumentNullException(nameof(membersToCompare));
            }

            var members = membersToCompare(TypeAccessor.GetAccessor <T>()).ToList();

            return(new Comparer <T>(GetEqualsFunc <T>(members), GetGetHashCodeFunc <T>(members)));
        }
        public static object GetId(object entity)
        {
            if (entity == null)
            {
                throw new ArgumentNullException("entity");
            }

            var metadata = RepositoryFramework.GetDefineMetadataAndCheck(entity.GetType());
            var ta       = TypeAccessor.GetAccessor(metadata.EntityType);

            return(ta.GetProperty(metadata.IdMember.Name, entity));
        }
Example #10
0
        /// <summary>
        /// Gets the member information from given expression.
        /// </summary>
        /// <remarks>
        /// Returns member information for given expressions, e.g.:
        /// <list type="bullet">
        /// <item><description>For: x =&gt; x.SomeProperty, returns MemberInfo of SomeProperty.</description></item>
        /// <item><description>For: x =&gt; x.SomeMethod(), returns MethodInfo of SomeMethod.</description></item>
        /// <item><description>For: x =&gt; new { X = x.Name }, return ConstructorInfo of anonymous type.</description></item>
        /// <item><description>For: x =&gt; Sql.Property&lt;int&gt;(x, "SomeProperty"), returns MemberInfo of "SomeProperty" if exists on type, otherwise returns DynamicColumnInfo for SomeProperty on given type.</description></item>
        /// </list>
        /// </remarks>
        /// <param name="expr">The expression.</param>
        /// <returns></returns>
        /// <exception cref="ArgumentException">Only simple, non-navigational, member names are supported in this context (e.g.: x =&gt; Sql.Property(x, \"SomeProperty\")).</exception>
        public static MemberInfo GetMemberInfo(Expression expr)
        {
            while (expr.NodeType == ExpressionType.Convert || expr.NodeType == ExpressionType.ConvertChecked || expr.NodeType == ExpressionType.TypeAs)
            {
                expr = ((UnaryExpression)expr).Operand;
            }

            if (expr.NodeType == ExpressionType.New)
            {
                return(((NewExpression)expr).Constructor);
            }

            if (expr is MethodCallExpression methodCall && methodCall.Method.IsSqlPropertyMethodEx())
            {
                // validate expression and get member name
                var arg1 = methodCall.Arguments[0].NodeType == ExpressionType.Convert
                                        ? ((UnaryExpression)methodCall.Arguments[0]).Operand
                                        : methodCall.Arguments[0];

                if (arg1.NodeType != ExpressionType.Constant && arg1.NodeType != ExpressionType.Parameter)
                {
                    throw new ArgumentException("Only simple, non-navigational, member names are supported in this context (e.g.: x => Sql.Property(x, \"SomeProperty\")).");
                }

                var memberName = (string)methodCall.Arguments[1].EvaluateExpression() !;

                // check if member exists on type
                var existingMember = TypeAccessor.GetAccessor(arg1.Type).Members.SingleOrDefault(m =>
                                                                                                 m.Name == memberName &&
                                                                                                 (m.MemberInfo.MemberType == MemberTypes.Property || m.MemberInfo.MemberType == MemberTypes.Field));

                if (existingMember != null)
                {
                    return(existingMember.MemberInfo);
                }

                // create dynamic column info
                return(new DynamicColumnInfo(arg1.Type, methodCall.Method.GetGenericArguments()[0], memberName));
            }

            if (expr.NodeType == ExpressionType.ArrayLength)
            {
                return(((UnaryExpression)expr).Operand.Type.GetProperty(nameof(Array.Length)) !);
            }

            return
                (expr is MemberExpression me
                                        ? me.Member
                                        : expr is MethodCallExpression mce
                                                ? mce.Method
                                                : (MemberInfo)((NewExpression)expr).Constructor);
        }
Example #11
0
        public void GetAbstractValue()
        {
            var ta = TypeAccessor.GetAccessor(typeof(TestObject2));
            var o  = (TestObject2)ta.CreateInstance();

            o.IntProperty = 20;
            o.StrProperty = "10";
            o.SetProperty = 30;

            Assert.AreEqual(20, ta["IntProperty"].GetValue(o));
            Assert.AreEqual("10", ta["StrProperty"].GetValue(o));
            Assert.AreEqual(30, ta["SetProperty"].GetValue(o));
        }
        public void Test()
        {
            TypeAccessor ta = TypeAccessor.GetAccessor(typeof(RootType));

            PropertyDescriptorCollection col  = ta.CreateExtendedPropertyDescriptors(null, null);
            PropertyDescriptor           prop = col["Type1+Type2+Name"];

            RootType obj = new RootType();

            object value = prop.GetValue(obj);

            Assert.AreEqual("test", value);
        }
Example #13
0
 public MappingImpl(
     ExpressionBuilder builder,
     Expression fromExpression,
     Expression toExpression)
 {
     _builder        = builder;
     _fromExpression = fromExpression;
     _toExpression   = toExpression;
     _localObject    = Parameter(_toExpression.Type, "obj" + ++_builder._data.NameCounter);
     _fromAccessor   = TypeAccessor.GetAccessor(_fromExpression.Type);
     _toAccessor     = TypeAccessor.GetAccessor(_toExpression.Type);
     _cacheMapper    = _builder._mapperBuilder.ProcessCrossReferences != false;
 }
        IClassJoinCascadeProcessor GetProcessor()
        {
            if (!inited)
            {
                var pa = TypeAccessor.GetAccessor(typeof(TEntity));

                processor.KeyFunc     = (entity) => EntityUtil.GetId(entity);
                processor.JoinKeyFunc = (join) => EntityUtil.GetId(join);
                processor.JoinFunc    = (join) => (TJoin)pa.GetProperty(joinMetadata.JoinName, join);
                inited = true;
            }
            return(processor);
        }
Example #15
0
        public void Sort(ListSortDirection direction, params string[] memberNames)
        {
            if (memberNames == null)
            {
                throw new ArgumentNullException("memberNames");
            }
            if (memberNames.Length == 0)
            {
                throw new ArgumentOutOfRangeException("memberNames");
            }

            Sort(new SortMemberComparer(TypeAccessor.GetAccessor(ItemType), direction, memberNames));
        }
Example #16
0
        private static MethodInfo FindRelatedMethod()
        {
            var managerAccessor = TypeAccessor.GetAccessor(typeof(RelationshipManager));

            if (managerAccessor == null)
            {
                return(null);
            }

            var methodAccessor = managerAccessor.FindMethod("GetRelatedReference", typeof(string), typeof(string));

            return(methodAccessor == null ? null : methodAccessor.MethodInfo);
        }
Example #17
0
        public void HasSetter()
        {
            var ta = TypeAccessor.GetAccessor(typeof(TestObject1));

            Assert.IsTrue(ta["IntField"].HasSetter);
            Assert.IsTrue(ta["IntProperty"].HasSetter);
            Assert.IsTrue(ta["StrField"].HasSetter);
            Assert.IsFalse(ta["StrProperty"].HasSetter);

            Assert.IsTrue(ta["SetProperty"].HasSetter);
            Assert.IsNull(ta["ProtectedProperty"]);
            Assert.IsFalse(ta["ProtectedSetter"].HasSetter);
        }
Example #18
0
            void CreateMapper(MappingSchema mappingSchema)
            {
                if (_mapper != null)
                {
                    return;
                }

                var entityDesc = mappingSchema.GetEntityDescriptor(typeof(T));

                _keyColumns = entityDesc.Columns.Where(c => c.IsPrimaryKey).Select(c => c.MemberAccessor).ToList();

                if (_keyColumns.Count == 0)
                {
                    _keyColumns = entityDesc.Columns.Select(c => c.MemberAccessor).ToList();
                }

                if (typeof(T) == typeof(TK))
                {
                    _mapper = k => (T)(object)k;
                    return;
                }

                if (mappingSchema.IsScalarType(typeof(TK)))
                {
                    if (_keyColumns.Count != 1)
                    {
                        throw new LinqToDBConvertException($"Type '{typeof(T).Name}' must contain only one key column.");
                    }

                    _mapper = v =>
                    {
                        var e = entityDesc.TypeAccessor.CreateInstanceEx();
                        _keyColumns[0].Setter(e, v);
                        return((T)e);
                    };
                }
                else
                {
                    var fromNames = new HashSet <string>(TypeAccessor.GetAccessor <TK>().Members.Select(m => m.Name));

                    foreach (var column in _keyColumns)
                    {
                        if (!fromNames.Contains(column.Name))
                        {
                            throw new LinqToDBConvertException($"Type '{typeof(TK).Name}' must contain field or property '{column.Name}'.");
                        }
                    }

                    _mapper = Map.GetMapper <TK, T>(m => m.SetToMemberFilter(ma => _keyColumns.Count == 0 || _keyColumns.Contains(ma))).GetMapper();
                }
            }
Example #19
0
        static void BuildSetter(
            ExpressionBuilder builder,
            IBuildContext into,
            List <SqlQuery.SetExpression> items,
            IBuildContext ctx,
            MemberInitExpression expression,
            Expression path)
        {
            foreach (var binding in expression.Bindings)
            {
                var member = binding.Member;

                if (member is MethodInfo)
                {
                    member = TypeHelper.GetPropertyByMethod((MethodInfo)member);
                }

                if (binding is MemberAssignment)
                {
                    var ma = binding as MemberAssignment;
                    var pe = Expression.MakeMemberAccess(path, member);

                    if (ma.Expression is MemberInitExpression && !into.IsExpression(pe, 1, RequestFor.Field).Result)
                    {
                        BuildSetter(
                            builder,
                            into,
                            items,
                            ctx,
                            (MemberInitExpression)ma.Expression, Expression.MakeMemberAccess(path, member));
                    }
                    else
                    {
                        var column = into.ConvertToSql(pe, 1, ConvertFlags.Field);
                        var expr   = builder.ConvertToSqlExpression(ctx, ma.Expression, false);

                        if (expr is SqlValueBase && TypeHelper.IsEnumOrNullableEnum(ma.Expression.Type))
                        {
                            var memberAccessor = TypeAccessor.GetAccessor(ma.Member.DeclaringType)[ma.Member.Name];
                            ((SqlValueBase)expr).SetEnumConverter(memberAccessor, builder.MappingSchema);
                        }

                        items.Add(new SqlQuery.SetExpression(column[0].Sql, expr));
                    }
                }
                else
                {
                    throw new InvalidOperationException();
                }
            }
        }
        IClassJoinCascadeProcessor GetProcessor()
        {
            if (!inited)
            {
                var ta = TypeAccessor.GetAccessor(typeof(TEntity));

                processor.KeyFunc        = (entity) => EntityUtil.GetId(entity);
                processor.JoinKeyFunc    = (join) => EntityUtil.GetId(join);
                processor.JoinFunc       = (join) => (IList <TJoin>)ta.GetProperty(joinMetadata.JoinName, join);
                processor.SourceJoinFunc = (entity) => (IList <TJoin>)joinMetadata.DataProcesser.Process(entity);
                inited = true;
            }
            return(processor);
        }
Example #21
0
        /// <summary>
        /// Initializes a new instance of the <see cref="DynamicProxy"/> class.
        /// </summary>
        /// <param name="wrapped">The wrapped object.</param>
        /// <param name="safeMode">if set to <c>true</c>, return null when name not found.</param>
        public DynamicProxy(object wrapped, bool safeMode)
        {
            if (wrapped == null)
            {
                throw new ArgumentNullException("wrapped");
            }

            _wrapped = wrapped;
            SafeMode = safeMode;

            Type type = _wrapped.GetType();

            _typeAccessor = TypeAccessor.GetAccessor(type);
        }
Example #22
0
        private DataContractJsonSerializer GetSerializer(object obj)
        {
            var type      = TypeAccessor.GetAccessor(MemberAccessor.Type).Type;
            var extraType = obj != null?TypeHelper.GetListItemType(obj) : typeof(object);

            var extraType2 = TypeHelper.GetListItemType(type);
            var extraTypes = new[] { TypeAccessor.GetAccessor(extraType).Type, TypeAccessor.GetAccessor(extraType2).Type };

            var serializer = extraType != typeof(object) || extraType2 != typeof(object)
                                ? new DataContractJsonSerializer(type, extraTypes)
                                : new DataContractJsonSerializer(type);

            return(serializer);
        }
Example #23
0
        private EntityMapping GetClassMap(Type type)
        {
            var classMapping = Configuration.Mapping.GetOrAdd(type, t =>
            {
                var typeAccessor = TypeAccessor.GetAccessor(t);
                var mapping      = new EntityMapping(typeAccessor)
                {
                    AutoMap = Configuration.AutoMap
                };
                return(mapping);
            });

            return(classMapping);
        }
Example #24
0
        /// <summary>
        /// Gets the member information from given expression.
        /// </summary>
        /// <remarks>
        /// Returns member information for given expressions, e.g.:
        /// <list type="bullet">
        /// <item><description>For: x =&gt; x.SomeProperty, returns MemberInfo of SomeProperty.</description></item>
        /// <item><description>For: x =&gt; x.SomeMethod(), returns MethodInfo of SomeMethod.</description></item>
        /// <item><description>For: x =&gt; new { X = x.Name }, return ConstructorInfo of anonymous type.</description></item>
        /// <item><description>For: x =&gt; Sql.Property&lt;int&gt;(x, "SomeProperty"), returns MemberInfo of "SomeProperty" if exists on type, otherwise returns DynamicColumnInfo for SomeProperty on given type.</description></item>
        /// </list>
        /// </remarks>
        /// <param name="expr">The expression.</param>
        /// <returns></returns>
        /// <exception cref="ArgumentException">Only simple, non-navigational, member names are supported in this context (e.g.: x =&gt; Sql.Property(x, \"SomeProperty\")).</exception>
        public static MemberInfo GetMemberInfo(Expression expr)
        {
            while (expr.NodeType == ExpressionType.Convert || expr.NodeType == ExpressionType.ConvertChecked)
            {
                expr = ((UnaryExpression)expr).Operand;
            }

            if (expr.NodeType == ExpressionType.New)
            {
                return(((NewExpression)expr).Constructor);
            }

            if (expr is MethodCallExpression methodCall && methodCall.Method.IsSqlPropertyMethodEx())
            {
                // validate expression and get member name
                var arg1 = methodCall.Arguments[0].NodeType == ExpressionType.Convert
                                        ? ((UnaryExpression)methodCall.Arguments[0]).Operand
                                        : methodCall.Arguments[0];

                if (arg1.NodeType != ExpressionType.Constant && arg1.NodeType != ExpressionType.Parameter || methodCall.Arguments[1].NodeType != ExpressionType.Constant)
                {
                    throw new ArgumentException("Only simple, non-navigational, member names are supported in this context (e.g.: x => Sql.Property(x, \"SomeProperty\")).");
                }

                var memberName = (string)((ConstantExpression)methodCall.Arguments[1]).Value;

                // check if member exists on type
                var existingMember = TypeAccessor.GetAccessor(arg1.Type).Members.SingleOrDefault(m =>
                                                                                                 m.Name == memberName &&
                                                                                                 (m.MemberInfo.MemberType == MemberTypes.Property || m.MemberInfo.MemberType == MemberTypes.Field));

                if (existingMember != null)
                {
                    return(existingMember.MemberInfo);
                }

#if !NETSTANDARD1_6
                // create dynamic column info
                return(new DynamicColumnInfo(arg1.Type, methodCall.Method.GetGenericArguments()[0], memberName));
#else
                throw new NotSupportedException("Dynamic columns are not supported on .NET Standard 1.6.");
#endif
            }

            return
                (expr is MemberExpression     ? ((MemberExpression)expr).Member :
                 expr is MethodCallExpression ? ((MethodCallExpression)expr).Method :
                 (MemberInfo)((NewExpression)expr).Constructor);
        }
        public void Test()
        {
            TypeAccessor ta = TypeAccessor.GetAccessor(typeof(Test1));
            Test1        t  = (Test1)ta.CreateInstance();

            Dictionary <string, object> dic = new Dictionary <string, object>();

            dic.Add("Name", "John");

            Map.MapSourceToDestination(
                Map.DefaultSchema.CreateDictionaryMapper(dic), dic,
                Map.GetObjectMapper(t.GetType()), t);

            Assert.AreEqual("John", t.Name);
        }
Example #26
0
        /// <summary>
        /// Returns <see cref="IValueConverter"/> for specific column.
        /// </summary>
        public virtual IValueConverter?GetValueConverter(ColumnDescriptor columnDescriptor)
        {
            if (ValueConverter != null)
            {
                return(ValueConverter);
            }

            if (ConverterType == null)
            {
                return(null);
            }

            var dynamicConverter = (IValueConverter)TypeAccessor.GetAccessor(ConverterType).CreateInstance();

            return(dynamicConverter);
        }
Example #27
0
        protected override void OnConnectionTypeCreated(Type connectionType)
        {
            _mySqlDecimalType  = connectionType.AssemblyEx().GetType("MySql.Data.Types.MySqlDecimal", true);
            _mySqlDateTimeType = connectionType.AssemblyEx().GetType("MySql.Data.Types.MySqlDateTime", true);

            _mySqlDecimalValueGetter  = TypeAccessor.GetAccessor(_mySqlDecimalType) ["Value"].Getter;
            _mySqlDateTimeValueGetter = TypeAccessor.GetAccessor(_mySqlDateTimeType)["Value"].Getter;

            SetProviderField(_mySqlDecimalType, "GetMySqlDecimal");
            SetProviderField(_mySqlDateTimeType, "GetMySqlDateTime");
            SetToTypeField(_mySqlDecimalType, "GetMySqlDecimal");
            SetToTypeField(_mySqlDateTimeType, "GetMySqlDateTime");

            MappingSchema.SetDataType(_mySqlDecimalType, DataType.Decimal);
            MappingSchema.SetDataType(_mySqlDateTimeType, DataType.DateTime2);
        }
Example #28
0
        /// <summary>
        /// Creates an instance of the specified type.
        /// </summary>
        /// <param name="type">The type to create.</param>
        /// <returns>A new instance of the specified type.</returns>
        public static object CreateInstance(Type type)
        {
            if (type == null)
            {
                throw new ArgumentNullException("type");
            }

            var typeAccessor = TypeAccessor.GetAccessor(type);

            if (typeAccessor == null)
            {
                throw new InvalidOperationException(string.Format("Could not find constructor for {0}.", type.Name));
            }

            return(typeAccessor.Create());
        }
        internal void CloneEntity(object source, object target)
        {
            if (source == null)
            {
                return;
            }

            Arguments.NotNull(target, "target");

            if (dataCloners == null || dataCloners.Count == 0)
            {
                var ta = TypeAccessor.GetAccessor(entityType);
                dataCloners = dataProperties.Select(o => ta.GetPropertyClone(o.Name)).ToList();
            }
            dataCloners.ForEach(o => o(source, target));
        }
        internal IMethodAccessor GetFormatter(Type entityType, string name)
        {
            string fullName = entityType.FullName + "." + name;

            return(_formatterCache.GetOrAdd(fullName, key =>
            {
                var formatAttribute = GetAttribute <AuditPropertyFormatAttribute>(entityType, name);
                if (formatAttribute == null)
                {
                    return null;
                }

                var typeAccessor = TypeAccessor.GetAccessor(formatAttribute.FormatType);
                return typeAccessor.FindMethod(formatAttribute.MethodName, typeof(AuditPropertyContext));
            }));
        }