/// <summary> /// Gets the property reader. /// </summary> private static IDelegatePropertyReader GetPropertyReader(PropertyInfo property, TypeMetaData context) { IDelegatePropertyReader actualReader = DelegatePropertyFactory.CreatePropertyReader(property); if (actualReader != null) { context.PropertyReaders.Add(property, actualReader); } return(actualReader); }
/// <summary> /// Creates the wrapper object property wrapper. /// </summary> private static PropertyDescriptor CreateWrapperObjectPropertyWrapper(TypeMetaData context, PropertyInfo property) { IDelegatePropertyReader actualReader = GetPropertyReader(property, context); IDelegatePropertyWriter actualWriter = GetPropertyWriter(property, context); Func <object, object> reader = property.CanRead ? new Func <object, object>(o => actualReader.GetValue(o)) : null; Action <object, object> writer = property.CanWrite ? new Action <object, object>((o, v) => actualWriter.SetValue(o, v)) : null; DelegatePropertyDescriptor descriptor = new DelegatePropertyDescriptor( property.Name, property.DeclaringType, property.PropertyType, reader, writer ); return(descriptor); }
/// <summary> /// Creates the property reader. /// </summary> /// <param name="property">The property.</param> /// <returns></returns> public static IDelegatePropertyReader CreatePropertyReader(PropertyInfo property) { IDelegatePropertyReader reader = null; if (property != null) { Type delegateReaderType = typeof(Func<,>).MakeGenericType(property.DeclaringType, property.PropertyType); Type readerType = typeof(DelegatePropertyReader<,>).MakeGenericType(property.DeclaringType, property.PropertyType); if (property.CanRead) { MethodInfo propertyGetterMethodInfo = property.GetGetMethod(); Delegate propertyGetterDelegate = Delegate.CreateDelegate( delegateReaderType, propertyGetterMethodInfo); reader = (IDelegatePropertyReader)Activator.CreateInstance(readerType, propertyGetterDelegate); } } return reader; }