複数のプロパティを持つクラスがあります。
public class Employee
{
public string TYPE { get; set; }
public int? SOURCE_ID { get; set; }
public string FIRST_NAME { get; set; }
public string LAST_NAME { get; set; }
public List<Department> departmentList { get; set; }
public List<Address> addressList { get; set; }
}
時々このオブジェクトは任意のプロパティの値を返します
Employee emp = new Employee();
emp.FIRST_NAME= 'abc';
残りの値はnullです。これは問題ありません
しかし、いつ確認すればいいのでしょうかすべての値オブジェクトのプロパティがnullである
string.IsNullOrEmpty()
オブジェクトの場合のように?
現在、私は次のように確認しています。
if(emp.FIRST_NAME == null && emp.LAST_NAME == null && emp.TYPE == null && emp.departmentList == null ...)
ベストアンサー1
編集
この回答は前回いくつか投票を受けたので、少し改善して、呼び出さArePropertiesNotNull
れるたびにプロパティを取得するのではなく、タイプごとに 1 回だけ取得するように簡単なキャッシュを追加することにしました。
public static class PropertyCache<T>
{
private static readonly Lazy<IReadOnlyCollection<PropertyInfo>> publicPropertiesLazy
= new Lazy<IReadOnlyCollection<PropertyInfo>>(() => typeof(T).GetProperties());
public static IReadOnlyCollection<PropertyInfo> PublicProperties => PropertyCache<T>.publicPropertiesLazy.Value;
}
public static class Extensions
{
public static bool ArePropertiesNotNull<T>(this T obj)
{
return PropertyCache<T>.PublicProperties.All(propertyInfo => propertyInfo.GetValue(obj) != null);
}
}
(古い回答は下記にあります。)
提案されているように反射を使うこともできますジョエル・ハークス例えば、私はこの再利用可能な、すぐに使える拡張メソッドをまとめました
public static bool ArePropertiesNotNull<T>(this T obj)
{
return typeof(T).GetProperties().All(propertyInfo => propertyInfo.GetValue(obj) != null);
}
これは次のように呼び出すことができます
var employee = new Employee();
bool areAllPropertiesNotNull = employee.ArePropertiesNotNull();
そして、areAllPropertiesNotNull
すべてのプロパティが null でないかどうかを示すフラグをチェックできるようになりました。true
すべてのプロパティが null でない場合には を返し、そうでない場合は を返しますfalse
。
このアプローチの利点
- チェックでは、プロパティ タイプが null 可能かどうかは関係ありません。
- 上記の方法は汎用的であるため、任意の型に使用でき、チェックする型ごとに定型コードを記述する必要はありません。
- 後でクラスを変更する場合でも、将来性があります。(イスピロ)。
デメリット
- リフレクションはかなり遅くなる可能性があり、この場合、現在行っている明示的なコードを書くよりも確かに遅くなります。単純なキャッシュ(レジナルド・ブルーそのオーバーヘッドの多くを削除します。
私の意見では、 を使用すると開発時間とコードの繰り返しが削減されるため、わずかなパフォーマンスのオーバーヘッドは無視できますが、結果は人によって異なりますArePropertiesNotNull
。