public PropertyDescriptor(TypeDescriptor declaringTypeDescriptor, Type ownerType, PropertyInfo propertyInfo)
		{
			this.OwnerType = ownerType;
			this.PropertyInfo = propertyInfo;
			this.DeclaringTypeDescriptor = declaringTypeDescriptor;

			this.ValueRequiredAttribute = propertyInfo.GetFirstCustomAttribute<ValueRequiredAttribute>(true);
			this.DefaultValueAttribute = propertyInfo.GetFirstCustomAttribute<DefaultValueAttribute>(true);
			this.BackReferenceAttribute = propertyInfo.GetFirstCustomAttribute<BackReferenceAttribute>(true);
			this.RelatedDataAccessObjectsAttribute = propertyInfo.GetFirstCustomAttribute<RelatedDataAccessObjectsAttribute>(true);
			this.PersistedMemberAttribute = propertyInfo.GetFirstCustomAttribute<PersistedMemberAttribute>(true);
			this.ComputedMemberAttribute = propertyInfo.GetFirstCustomAttribute<ComputedMemberAttribute>(true);
			this.ComputedTextMemberAttribute = propertyInfo.GetFirstCustomAttribute<ComputedTextMemberAttribute>(true);
			this.ForeignObjectConstraintAttribute = propertyInfo.GetFirstCustomAttribute<ForeignObjectConstraintAttribute>(true);

			if (PersistedMemberAttribute == null)
			{
				this.PersistedMemberAttribute = (PersistedMemberAttribute)this.ComputedMemberAttribute ?? this.ComputedTextMemberAttribute;
			}

			if (this.PropertyType.IsIntegerType(true) || this.PropertyType.GetUnwrappedNullableType() == typeof(Guid))
			{
				this.AutoIncrementAttribute = propertyInfo.GetFirstCustomAttribute<AutoIncrementAttribute>(true);
			}

			this.PrimaryKeyAttribute = this.PropertyInfo.GetFirstCustomAttribute<PrimaryKeyAttribute>(true);
			this.IsPrimaryKey = this.PrimaryKeyAttribute != null && this.PrimaryKeyAttribute.IsPrimaryKey;
			this.IndexAttributes = this.PropertyInfo.GetCustomAttributes(typeof(IndexAttribute), true).OfType<IndexAttribute>().ToReadOnlyCollection();
			this.UniqueAttribute = this.PropertyInfo.GetFirstCustomAttribute<UniqueAttribute>(true);

			var named = this.PersistedMemberAttribute ?? this.BackReferenceAttribute ?? (NamedMemberAttribute)this.RelatedDataAccessObjectsAttribute;

			if (named != null)
			{
				this.PersistedName = named.GetName(this, this.DeclaringTypeDescriptor.TypeDescriptorProvider.Configuration.NamingTransforms?.PersistedMemberName);
				this.PrefixName = named.GetPrefixName(this, this.DeclaringTypeDescriptor.TypeDescriptorProvider.Configuration.NamingTransforms?.PersistedMemberPrefixName);
				this.SuffixName = named.GetSuffixName(this, this.DeclaringTypeDescriptor.TypeDescriptorProvider.Configuration.NamingTransforms?.PersistedMemberSuffixName);
			}

			var expression = this.ComputedMemberAttribute?.GetSetLambdaExpression(this.DeclaringTypeDescriptor.TypeDescriptorProvider.Configuration, this)?.Body.StripConvert();

			if (expression?.NodeType == ExpressionType.Assign)
			{
				var assignmentExpression = expression as BinaryExpression;

				if (assignmentExpression.Left.NodeType == ExpressionType.MemberAccess)
				{
					var memberAccess = assignmentExpression.Left as MemberExpression;

					this.ComputedMemberAssignTarget = memberAccess.Member as PropertyInfo;
					this.ComputedMemberAssignmentValue = assignmentExpression.Right;
				}
			}
		}
        public PropertyDescriptor(TypeDescriptor declaringTypeDescriptor, Type ownerType, PropertyInfo propertyInfo)
        {
            this.OwnerType               = ownerType;
            this.PropertyInfo            = propertyInfo;
            this.DeclaringTypeDescriptor = declaringTypeDescriptor;

            this.ValueRequiredAttribute            = propertyInfo.GetFirstCustomAttribute <ValueRequiredAttribute>(true);
            this.DefaultValueAttribute             = propertyInfo.GetFirstCustomAttribute <DefaultValueAttribute>(true);
            this.BackReferenceAttribute            = propertyInfo.GetFirstCustomAttribute <BackReferenceAttribute>(true);
            this.RelatedDataAccessObjectsAttribute = propertyInfo.GetFirstCustomAttribute <RelatedDataAccessObjectsAttribute>(true);
            this.PersistedMemberAttribute          = propertyInfo.GetFirstCustomAttribute <PersistedMemberAttribute>(true);
            this.ComputedMemberAttribute           = propertyInfo.GetFirstCustomAttribute <ComputedMemberAttribute>(true);
            this.ComputedTextMemberAttribute       = propertyInfo.GetFirstCustomAttribute <ComputedTextMemberAttribute>(true);
            this.ForeignObjectConstraintAttribute  = propertyInfo.GetFirstCustomAttribute <ForeignObjectConstraintAttribute>(true);

            if (PersistedMemberAttribute == null)
            {
                this.PersistedMemberAttribute = (PersistedMemberAttribute)this.ComputedMemberAttribute ?? this.ComputedTextMemberAttribute;
            }

            if (this.PropertyType.IsIntegerType(true) || this.PropertyType.GetUnwrappedNullableType() == typeof(Guid))
            {
                this.AutoIncrementAttribute = propertyInfo.GetFirstCustomAttribute <AutoIncrementAttribute>(true);
            }

            this.PrimaryKeyAttribute = this.PropertyInfo.GetFirstCustomAttribute <PrimaryKeyAttribute>(true);
            this.IsPrimaryKey        = this.PrimaryKeyAttribute != null && this.PrimaryKeyAttribute.IsPrimaryKey;
            this.IndexAttributes     = this.PropertyInfo.GetCustomAttributes(typeof(IndexAttribute), true).OfType <IndexAttribute>().ToReadOnlyCollection();
            this.UniqueAttribute     = this.PropertyInfo.GetFirstCustomAttribute <UniqueAttribute>(true);

            var named = this.PersistedMemberAttribute ?? this.BackReferenceAttribute ?? (NamedMemberAttribute)this.RelatedDataAccessObjectsAttribute;

            if (named != null)
            {
                this.PersistedName = named.GetName(this, this.DeclaringTypeDescriptor.TypeDescriptorProvider.Configuration.NamingTransforms?.PersistedMemberName);
                this.PrefixName    = named.GetPrefixName(this, this.DeclaringTypeDescriptor.TypeDescriptorProvider.Configuration.NamingTransforms?.PersistedMemberPrefixName);
                this.SuffixName    = named.GetSuffixName(this, this.DeclaringTypeDescriptor.TypeDescriptorProvider.Configuration.NamingTransforms?.PersistedMemberSuffixName);
            }

            var expression = this.ComputedMemberAttribute?.GetSetLambdaExpression(this.DeclaringTypeDescriptor.TypeDescriptorProvider.Configuration, this)?.Body.StripConvert();

            if (expression?.NodeType == ExpressionType.Assign)
            {
                var assignmentExpression = expression as BinaryExpression;

                if (assignmentExpression.Left.NodeType == ExpressionType.MemberAccess)
                {
                    var memberAccess = assignmentExpression.Left as MemberExpression;

                    this.ComputedMemberAssignTarget    = memberAccess.Member as PropertyInfo;
                    this.ComputedMemberAssignmentValue = assignmentExpression.Right;
                }
            }
        }
Exemple #3
0
        public PropertyDescriptor(TypeDescriptor declaringTypeDescriptor, Type ownerType, PropertyInfo propertyInfo)
        {
            this.OwnerType               = ownerType;
            this.PropertyInfo            = propertyInfo;
            this.DeclaringTypeDescriptor = declaringTypeDescriptor;

            this.ValueRequiredAttribute            = propertyInfo.GetFirstCustomAttribute <ValueRequiredAttribute>(true);
            this.DefaultValueAttribute             = propertyInfo.GetFirstCustomAttribute <DefaultValueAttribute>(true);
            this.BackReferenceAttribute            = propertyInfo.GetFirstCustomAttribute <BackReferenceAttribute>(true);
            this.RelatedDataAccessObjectsAttribute = propertyInfo.GetFirstCustomAttribute <RelatedDataAccessObjectsAttribute>(true);
            this.PersistedMemberAttribute          = propertyInfo.GetFirstCustomAttribute <PersistedMemberAttribute>(true);
            this.ComputedMemberAttribute           = propertyInfo.GetFirstCustomAttribute <ComputedMemberAttribute>(true);
            this.ComputedTextMemberAttribute       = propertyInfo.GetFirstCustomAttribute <ComputedTextMemberAttribute>(true);
            this.ForeignObjectConstraintAttribute  = propertyInfo.GetFirstCustomAttribute <ForeignObjectConstraintAttribute>(true);

            if (this.PropertyType.IsIntegerType(true) || this.PropertyType.GetUnwrappedNullableType() == typeof(Guid))
            {
                this.AutoIncrementAttribute = propertyInfo.GetFirstCustomAttribute <AutoIncrementAttribute>(true);
            }

            this.PrimaryKeyAttribute = this.PropertyInfo.GetFirstCustomAttribute <PrimaryKeyAttribute>(true);
            this.IsPrimaryKey        = this.PrimaryKeyAttribute != null && this.PrimaryKeyAttribute.IsPrimaryKey;

            if (this.PersistedMemberAttribute != null)
            {
                this.PersistedName      = this.PersistedMemberAttribute.GetName(this.PropertyInfo, declaringTypeDescriptor);
                this.PersistedShortName = this.PersistedMemberAttribute.GetShortName(this.PropertyInfo, this.DeclaringTypeDescriptor);
            }
            else if (this.BackReferenceAttribute != null)
            {
                this.PersistedName      = this.BackReferenceAttribute.GetName(this.PropertyInfo, declaringTypeDescriptor);
                this.PersistedShortName = this.PersistedName;
            }
            else if (this.RelatedDataAccessObjectsAttribute != null)
            {
                this.PersistedName      = propertyInfo.Name;
                this.PersistedShortName = propertyInfo.Name;
            }

            this.IndexAttributes = new ReadOnlyList <IndexAttribute>(this.PropertyInfo.GetCustomAttributes(typeof(IndexAttribute), true).OfType <IndexAttribute>().ToList());
            this.UniqueAttribute = this.PropertyInfo.GetFirstCustomAttribute <UniqueAttribute>(true);
        }