public virtual void SetMemberValue(object model, MemberValue member, SerializationModelInfo modelInfo)
{
var modelType = model.GetType();
try
{
var modelEditor = model as IModelEditor;
if (modelEditor != null && modelInfo.CatelPropertyNames.Contains(member.Name))
{
modelEditor.SetValueFastButUnsecure(member.Name, member.Value);
}
else if (modelInfo.PropertyNames.Contains(member.Name))
{
var set = false;
var propertySerializable = model as IPropertySerializable;
if (propertySerializable != null)
{
set = propertySerializable.SetPropertyValue(member.Name, member.Value);
}
if (!set)
{
var memberMetadata = modelInfo.PropertiesByName[member.Name];
if (memberMetadata != null)
{
((PropertyInfo)memberMetadata.Tag).SetValue(model, member.Value, null);
set = true;
}
}
if (!set)
{
Log.Warning("Failed to set property '{0}.{1}' because the member cannot be found on the model", modelType.GetSafeFullName(false), member.Name);
}
}
else if (modelInfo.FieldNames.Contains(member.Name))
{
var set = false;
var fieldSerializable = model as IFieldSerializable;
if (fieldSerializable != null)
{
set = fieldSerializable.SetFieldValue(member.Name, member.Value);
}
if (!set)
{
var memberMetadata = modelInfo.FieldsByName[member.Name];
if (memberMetadata != null)
{
((FieldInfo)memberMetadata.Tag).SetValue(model, member.Value);
set = true;
}
}
if (!set)
{
Log.Warning("Failed to set field '{0}.{1}' because the member cannot be found on the model", modelType.GetSafeFullName(false), member.Name);
}
}
}
catch (Exception ex)
{
Log.Warning(ex, "Failed to populate '{0}.{1}', setting the member value threw an exception", modelType.GetSafeFullName(false), member.Name);
}
}
}