in src/BehaviorsSDKManaged/Microsoft.Xaml.Interactions/Core/ChangePropertyAction.cs [120:170]
private void UpdatePropertyValue(object targetObject)
{
Type targetType = targetObject.GetType();
PropertyInfo propertyInfo = targetType.GetRuntimeProperty(this.PropertyName.Path);
this.ValidateProperty(targetType.Name, propertyInfo);
Exception innerException = null;
try
{
object result = null;
string valueAsString = null;
Type propertyType = propertyInfo.PropertyType;
TypeInfo propertyTypeInfo = propertyType.GetTypeInfo();
if (this.Value == null)
{
// The result can be null if the type is generic (nullable), or the default value of the type in question
result = propertyTypeInfo.IsValueType ? Activator.CreateInstance(propertyType) : null;
}
else if (propertyTypeInfo.IsAssignableFrom(this.Value.GetType().GetTypeInfo()))
{
result = this.Value;
}
else
{
valueAsString = this.Value.ToString();
result = propertyTypeInfo.IsEnum ? Enum.Parse(propertyType, valueAsString, false) :
TypeConverterHelper.Convert(valueAsString, propertyType.FullName);
}
propertyInfo.SetValue(targetObject, result, new object[0]);
}
catch (FormatException e)
{
innerException = e;
}
catch (ArgumentException e)
{
innerException = e;
}
if (innerException != null)
{
throw new ArgumentException(string.Format(
CultureInfo.CurrentCulture,
ResourceHelper.ChangePropertyActionCannotSetValueExceptionMessage,
this.Value != null ? this.Value.GetType().Name : "null",
this.PropertyName,
propertyInfo.PropertyType.Name),
innerException);
}
}