void Write(XElement elem, Type t, object obj) { if (obj == null) { // For null entries in a nullable array // See https://github.com/Particular/NServiceBus/issues/2706 if (t.IsNullableType()) { elem.Value = "null"; } return; } if (!cache.typeMembers.TryGetValue(t, out var members)) { cache.InitType(t); members = cache.typeMembers[t]; } foreach (var prop in members.Item2) { if (IsIndexedProperty(prop)) { throw new NotSupportedException($"Type {t.FullName} contains an indexed property named {prop.Name}. Indexed properties are not supported on message types."); } WriteEntry(elem, prop.Name, prop.PropertyType, DelegateFactory.CreateGet(prop).Invoke(obj)); } foreach (var field in members.Item1) { WriteEntry(elem, field.Name, field.FieldType, DelegateFactory.CreateGet(field).Invoke(obj)); } }
public static object GetValue(this MemberInfo member, object source) { var fieldInfo = member as FieldInfo; if (fieldInfo != null) { var field = DelegateFactory.CreateGet(fieldInfo); return(field.Invoke(source)); } var propertyInfo = (PropertyInfo)member; if (!propertyInfo.CanRead) { if (propertyInfo.PropertyType.IsValueType) { return(Activator.CreateInstance(propertyInfo.PropertyType)); } return(null); } var property = DelegateFactory.CreateGet(propertyInfo); return(property.Invoke(source)); }
internal List <DataBusPropertyInfo> GetDataBusProperties(object message) { return(cache.GetOrAdd(message.GetType(), messageType => { var properties = new List <DataBusPropertyInfo>(); foreach (var propertyInfo in messageType.GetProperties()) { if (IsDataBusProperty(propertyInfo)) { properties.Add(new DataBusPropertyInfo { Name = propertyInfo.Name, Getter = DelegateFactory.CreateGet(propertyInfo), Setter = DelegateFactory.CreateSet(propertyInfo) }); } } return properties; })); }
internal IEnumerable <DataBusPropertyInfo> GetDataBusProperties(object message) { var messageType = message.GetType(); List <DataBusPropertyInfo> value; if (!cache.TryGetValue(messageType, out value)) { value = messageType.GetProperties() .Where(IsDataBusProperty) .Select(property => new DataBusPropertyInfo { Name = property.Name, Getter = DelegateFactory.CreateGet(property), Setter = DelegateFactory.CreateSet(property), }).ToList(); cache[messageType] = value; } return(value); }