C#におけるクラス型を引数で受けた時のnull判定

タイプセーフを保証するために、 object ではなくちゃんとしたクラス型で引数を受けたいことがある

その際に 指定しなかったパラメタ をどうやって弾くかという話

例えば

// a class
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

var redis = new RedisString<Person>(RedisServer.Default, "test-string-key");
await redis.Set(new Person { Name = "John" });

みたいな時の Person.Age をSetメソッドの中でどう弾くか、ということ

実装

ServiceStack/ServiceStack.OrmLite
                var value = fieldDef.GetValue(item);
                if (excludeDefaults
                    && (value == null || (!fieldDef.IsNullable && value.Equals(value.GetType().GetDefaultValue()))))
                    continue;

リフレクションを使って null 比較とデフォルト値比較。後者は拡張メソッド

ServiceStack.OrmLite/SqlExpression.cs at 9b69e300454632aa0eb8100370bf45a51a8d2edd · ServiceStack/ServiceStack.OrmLite · GitHub

Jil
                foreach (var memberName in metaObj.GetDynamicMemberNames())
                {
                    var getter = GetGetMember(dynType, memberName);
                    var val = getter(dyn);

                    if (val == null && opts.ShouldExcludeNulls) continue;

こちらもリフレクションからのnull比較

Jil/DynamicSerializer.cs at 71fc65c4148f1aa25fdf9a5fc166e51f91865ec9 · kevin-montrose/Jil · GitHub