public Identity IdentityOf(object obj)
        {
            IdentityPart[] parts = new IdentityPart[this.PartDefinitions.Length];
            for (int i = 0; i < parts.Length; i++)
            {
                parts[i] = new IdentityPart(this.PartDefinitions[i], this.PartDefinitions[i].Property.GetValue(obj));
            }

            ValidateConstraints(obj);

            return(new Identity(this, parts));
        }
        public override bool Equals(object obj)
        {
            if (!(obj is IdentityPart))
            {
                return(false);
            }

            IdentityPart otherPart = (IdentityPart)obj;

            return
                (Object.Equals(otherPart.PartDefinition, this.PartDefinition) &&
                 Object.Equals(otherPart.Value, this.Value));
        }
        public bool HasValidValues(params object[] values)
        {
            if (values.Length != this.PartDefinitions.Length)
            {
                return(false);
            }

            IdentityPart[] parts = new IdentityPart[this.PartDefinitions.Length];
            for (int i = 0; i < parts.Length; i++)
            {
                if (!this.PartDefinitions[i].Property.PropertyType.IsAssignableFrom(values[i].GetType()))
                {
                    return(false);
                }
            }

            return(true);
        }
        public Identity IdentityFromValues(IDictionary <IEntityProperty, object> propertyValues)
        {
            IdentityPart[] parts = new IdentityPart[this.PartDefinitions.Length];
            try
            {
                for (int i = 0; i < parts.Length; i++)
                {
                    parts[i] = new IdentityPart(this.PartDefinitions[i], propertyValues[this.PartDefinitions[i].Property]);
                }
            }
            catch (KeyNotFoundException)
            {
                throw new KeyNotFoundException(String.Format("The identity {{{0}}} requires properties that are not available.", this));
            }

            ValidateConstraints(propertyValues);

            return(new Identity(this, parts));
        }
        public Identity IdentityFromValues(params object[] values)
        {
            if (values.Length != this.PartDefinitions.Length)
            {
                throw new ArgumentException("The number of values is different than the identity definition parts.", "values");
            }

            IdentityPart[] parts = new IdentityPart[this.PartDefinitions.Length];
            for (int i = 0; i < parts.Length; i++)
            {
                if (!this.PartDefinitions[i].Property.PropertyType.IsAssignableFrom(values[i].GetType()))
                {
                    throw new ArgumentException("Passed value types don't match the parts of the identity definition.");
                }

                parts[i] = new IdentityPart(this.PartDefinitions[i], values[i]);
            }

            return(new Identity(this, parts));
        }