public virtual MemberValue GetMemberValue(object model, string memberName, SerializationModelInfo modelInfo)
{
var modelType = model.GetType();
try
{
var modelEditor = model as IModelEditor;
if (modelEditor != null && modelInfo.CatelPropertyNames.Contains(memberName))
{
var memberMetadata = modelInfo.CatelPropertiesByName[memberName];
var actualPropertyValue = modelEditor.GetValueFastButUnsecure(memberName);
var propertyValue = new MemberValue(SerializationMemberGroup.CatelProperty, modelType, memberMetadata.MemberType,
memberMetadata.MemberName, memberMetadata.MemberNameForSerialization, actualPropertyValue);
return propertyValue;
}
if (modelInfo.PropertiesByName.ContainsKey(memberName))
{
var memberMetadata = modelInfo.PropertiesByName[memberName];
object value = null;
var get = false;
var propertySerializable = model as IPropertySerializable;
if (propertySerializable != null)
{
get = propertySerializable.GetPropertyValue(memberName, ref value);
}
if (!get)
{
value = ((PropertyInfo)memberMetadata.Tag).GetValue(model, null);
}
var propertyValue = new MemberValue(SerializationMemberGroup.RegularProperty, modelType, memberMetadata.MemberType,
memberMetadata.MemberName, memberMetadata.MemberNameForSerialization, value);
return propertyValue;
}
if (modelInfo.FieldsByName.ContainsKey(memberName))
{
var memberMetadata = modelInfo.FieldsByName[memberName];
object value = null;
var get = false;
var fieldSerializable = model as IFieldSerializable;
if (fieldSerializable != null)
{
get = fieldSerializable.GetFieldValue(memberName, ref value);
}
if (!get)
{
value = ((FieldInfo)memberMetadata.Tag).GetValue(model);
}
var fieldValue = new MemberValue(SerializationMemberGroup.Field, modelType, memberMetadata.MemberType,
memberMetadata.MemberName, memberMetadata.MemberNameForSerialization, value);
return fieldValue;
}
}
catch (Exception ex)
{
Log.Warning(ex, "Failed to get value of member '{0}.{1}', skipping item during serialization", modelType.GetSafeFullName(false), memberName);
}
return null;
}