1. ホーム
  2. c#

[解決済み】Nullable型ではConvert.ChangeType()が失敗する。

2022-03-26 02:35:01

質問

文字列をオブジェクトのプロパティ値に変換したいのですが、その名前は文字列として持っています。このようにしようとしています。

string modelProperty = "Some Property Name";
string value = "SomeValue";
var property = entity.GetType().GetProperty(modelProperty);
if (property != null) {
    property.SetValue(entity, 
        Convert.ChangeType(value, property.PropertyType), null);
}

問題は、プロパティの型が nullable 型であるときに、これが失敗して Invalid Cast Exception を投げていることです。 これは、値が変換できない場合ではなく、手動でこれを行うと動作します (例. DateTime? d = Convert.ToDateTime(value); ) 似たような質問をいくつか見ましたが、まだうまくいきません。

どのように解決するのですか?

未検証ですが、おそらくこのようなものが動作すると思います。

string modelProperty = "Some Property Name";
string value = "Some Value";

var property = entity.GetType().GetProperty(modelProperty);
if (property != null)
{
    Type t = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType;

    object safeValue = (value == null) ? null : Convert.ChangeType(value, t);

    property.SetValue(entity, safeValue, null);
}