А вот и другой подход, использующий пользовательский Binder
(https://docs.microsoft.com/en-us/dotnet/api/system.reflection.binder?view=netframework-4.8)
Я сомневаюсь, что это то, что вы ищете, но, тем не менее, это может помочь. Здесь мы просто реализуем переопределение ChangeType.
public class TFDisplayBinder : Binder
{
public override object ChangeType(object value, Type type, System.Globalization.CultureInfo culture)
{
if (value is string)
{
return (TFDiplay)(string)value;
}
if (value is int)
{
return (TFDiplay)(int)value;
}
throw new NotImplementedException();
}
public override FieldInfo BindToField(BindingFlags bindingAttr, FieldInfo[] match, object value, System.Globalization.CultureInfo culture)
{
return Type.DefaultBinder.BindToField(bindingAttr, match, value, culture);
}
// You can implement the other abstract methods the same way, or just throw
// NotImplementedException for they are not invoked in our case
}
А при назначении с помощью отражения:
testDatatype t = new testDatatype();
Type s = t.GetType();
PropertyInfo p = s.GetProperty("Flag");
p.SetValue(t, "ss", BindingFlags.Default, new TFDisplayBinder(), null, null);