示例#1
0
        /// <summary>
        ///     Initializes a new instance of the <see cref="InspectedProperty" /> class.
        /// </summary>
        /// <param name="type">
        ///     The inspected type.
        /// </param>
        /// <param name="fieldInfo">
        ///     The field info.
        /// </param>
        /// <exception cref="ArgumentNullException">
        ///     If <paramref name="type" /> is null.
        /// </exception>
        /// <exception cref="ArgumentNullException">
        ///     If <paramref name="fieldInfo" /> is null.
        /// </exception>
        /// <exception cref="ArgumentException">
        ///     If <paramref name="fieldInfo" /> 's declaring type has not been set.
        /// </exception>
        internal InspectedProperty(Type type, FieldInfo fieldInfo)
        {
            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            if (fieldInfo == null)
            {
                throw new ArgumentNullException(nameof(fieldInfo));
            }

            if (fieldInfo.DeclaringType == null)
            {
                throw new ArgumentException("fieldInfo declaring type has not been set", nameof(fieldInfo));
            }

            this.Name                   = fieldInfo.SerializableName();
            this.InspectedType          = type;
            this.PropertyType           = fieldInfo.FieldType;
            this.IsNotNullableValueType = this.PropertyType.IsNotNullableValueType();

            if (fieldInfo.DeclaringType != fieldInfo.ReflectedType)
            {
                fieldInfo = fieldInfo.DeclaringType.GetField(fieldInfo.Name,
                                                             BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
            }

            try
            {
                this.Getter = DelegateFactory.CreateGetter(fieldInfo);
                this.Setter = DelegateFactory.CreateSetter(fieldInfo);
            }
            catch (Exception exception)
            {
                Logging.TraceException(exception);
            }

            this.Member = fieldInfo;

#if !HT4O_SERIALIZATION
            this.IdAttribute = fieldInfo.GetAttribute <IdAttribute>();
#endif
            this.IsTransient = fieldInfo.HasAttribute <TransientAttribute>() ||
                               fieldInfo.HasAttribute <NonSerializedAttribute>() ||
                               fieldInfo.HasAttribute <IgnoreDataMemberAttribute>();

            this.Ignore = fieldInfo.HasAttribute <IgnoreAttribute>();
        }
示例#2
0
 /// <summary>
 ///     Create the count function for the type specified.
 /// </summary>
 /// <param name="type">
 ///     The type.
 /// </param>
 /// <returns>
 ///     The newly created count function or null.
 /// </returns>
 private static Func <object, object> CreateCountMethod(Type type)
 {
     return(DelegateFactory.CreateGetter(type.GetProperty("Count",
                                                          BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy)));
 }