50617


お世話になります。  
System.Reflection.PropertyInfo.GetValueで取得したobjectがその型のデフォルト値であるか知りたく質問させていただきました。以下に例を記載します。

[code]

    var returnType = property.GetMethod.ReturnType;
    var value = property.GetValue (entity);
    // valueが「0」でreturnTypeがInt32であれば、 value == default (int)なのでtrueを返したい
    // valueが「null」でStringであれば、 value == default (string)なのでtrueを返したい
    
[/code]

今までは一個一個判定していたのでもっとスマートなやり方を知りたいです。

[code]

    (returnType == typeof (int) && (int) value == default (int)) ||
    (returnType == typeof (string) && (string) value == default (string))
    ...
    (returnType == typeof (byte[]) && (byte[]) value == default (byte[]))
    
[/code]

よろしくお願いします。


CC BY-SA 4.0
2018-11-25T14:01:28.430
50616
2018-11-25T14:27:39.367
2018-11-25T14:06:42.523
24385
24385
question
c#
PropertyInfo.GetValueで取得した値がその型のデフォルトであるか調べる方法


構造体はEqualsやメンバ次第かもしれませんが、  
以下ではどうでしょう。

[code]

    var returnType = property.GetMethod.ReturnType;
    var value = property.GetValue (entity);
    if (value == null) return true;
    var type = value.GetType();
    if(type.IsValueType) 
        return value.Equals(Activator.CreateInstance(type));
    return false;
    
[/code]

参照型のdefaultはnullですので、nullであれば初期値です。あとは値型なので実体化した値と一致すれば初期値でしょう。

* * *

修正しました。だいぶ恥ずかしい間違いをしてしまいました。  
nullでない場合は値型か確認した上で実体化したものと一致すればtrue。  
それ以外の参照型はfalseです。


CC BY-SA 4.0
2018-11-25T14:18:10.493
50617
2018-11-25T14:27:39.367
2018-11-25T14:27:39.367
728
728
50616
answer