Rewrite ReturnValueBinder to properly bind return values
This commit is contained in:
parent
d92f0a6f82
commit
57a4f2fb05
@ -6,44 +6,36 @@ using Connected.Interop;
|
||||
|
||||
namespace Connected.Data.Storage
|
||||
{
|
||||
internal static class ReturnValueBinder
|
||||
internal static class ReturnValueBinder
|
||||
{
|
||||
public static void Bind(IStorageOperation operation, object entity)
|
||||
{
|
||||
List<PropertyInfo> properties = null;
|
||||
if (operation is null || operation.Parameters is null)
|
||||
return;
|
||||
|
||||
foreach (var parameter in operation.Parameters)
|
||||
{
|
||||
if (parameter.Direction != ParameterDirection.ReturnValue && parameter.Direction != ParameterDirection.Output)
|
||||
continue;
|
||||
|
||||
if (parameter.Value == DBNull.Value)
|
||||
continue;
|
||||
|
||||
if (properties is null)
|
||||
var properties = new List<PropertyInfo>();
|
||||
|
||||
var all = operation.GetType().GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
|
||||
foreach (var prop in all)
|
||||
{
|
||||
properties = new List<PropertyInfo>();
|
||||
|
||||
var all = operation.GetType().GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
|
||||
foreach (var prop in all)
|
||||
{
|
||||
if (prop.FindAttribute<ReturnValueAttribute>() is not null)
|
||||
properties.Add(prop);
|
||||
}
|
||||
if (prop.FindAttribute<ReturnValueAttribute>() is not null)
|
||||
properties.Add(prop);
|
||||
}
|
||||
|
||||
PropertyInfo property = null;
|
||||
PropertyInfo? property = null;
|
||||
|
||||
if (property is null)
|
||||
foreach (var prop in properties)
|
||||
{
|
||||
foreach (var prop in properties)
|
||||
if (string.Equals(prop.Name, parameter.Name, StringComparison.Ordinal))
|
||||
{
|
||||
if (string.Equals(prop.Name, parameter.Name, StringComparison.Ordinal))
|
||||
{
|
||||
property = prop;
|
||||
break;
|
||||
}
|
||||
property = prop;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -62,9 +54,9 @@ namespace Connected.Data.Storage
|
||||
if (property is null)
|
||||
{
|
||||
var candidates = new List<string>
|
||||
{
|
||||
parameter.Name.Replace("@", string.Empty)
|
||||
};
|
||||
{
|
||||
parameter.Name.Replace("@", string.Empty)
|
||||
};
|
||||
|
||||
foreach (var prop in properties)
|
||||
{
|
||||
@ -82,26 +74,28 @@ namespace Connected.Data.Storage
|
||||
}
|
||||
}
|
||||
|
||||
if (property is not null)
|
||||
if (property is null)
|
||||
return;
|
||||
|
||||
var existingValue = property.GetValue(operation);
|
||||
var overwriteAtt = property.FindAttribute<ReturnValueAttribute>();
|
||||
|
||||
if (overwriteAtt is null)
|
||||
return;
|
||||
|
||||
switch (overwriteAtt.ValueBehavior)
|
||||
{
|
||||
var existingValue = property.GetValue(operation);
|
||||
var overwriteAtt = property.FindAttribute<ReturnValueAttribute>();
|
||||
case PropertyValueBehavior.OverwriteDefault:
|
||||
var defaultValue = property.PropertyType.GetDefault();
|
||||
|
||||
switch (overwriteAtt.ValueBehavior)
|
||||
{
|
||||
case PropertyValueBehavior.OverwriteDefault:
|
||||
var defaultValue = property.PropertyType.GetDefault();
|
||||
|
||||
if (Equals(existingValue, defaultValue))
|
||||
property.SetValue(operation, parameter.Value);
|
||||
break;
|
||||
case PropertyValueBehavior.AlwaysOverwrite:
|
||||
property.SetValue(operation, parameter.Value);
|
||||
break;
|
||||
}
|
||||
if (Equals(existingValue, defaultValue))
|
||||
property.SetValue(entity, parameter.Value);
|
||||
break;
|
||||
case PropertyValueBehavior.AlwaysOverwrite:
|
||||
property.SetValue(entity, parameter.Value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user