正如@IanKemp 建议的那样,当您想跳过属性分配时,您无法避免 if-check。不要与分配默认值混淆。
最简单的解决方案是将可空值检查和属性分配封装到单个操作中。为避免传递PropertyInfo
,您可以使用扩展方法:
public static class ReflectionExtensions
{
public static void SetValueIfNotNull<T>(this PropertyInfo prop, object obj, T? maybe)
where T : struct
{
if (maybe.HasValue)
prop.SetValue(obj, maybe.Value);
}
}
用法:
myObj.GetType().GetProperty("birthdate").SetValueIfNotNull(myObj, dep.BirthDate);
或者,如果您经常使用可空值并且属性设置不是您唯一要做的事情,那么您可以编写一个可空扩展,它将您的代码带回不可为空的路径:
public static class NullableExtensions
{
// Note that action has non-nullable argument
public static void Invoke<T>(this Nullable<T> nullable, Action<T> action)
where T: struct
{
if (nullable.HasValue)
action(nullable.Value);
}
}
这种方法交换了一些东西——如果 nullable 有值,现在你可以对 nullable 变量的值调用操作:
dep.BirthDate.Invoke(date => myObj.GetType().GetProperty("birthday").SetValue(myObj, date));
或者如果您要调用单参数函数,甚至可以采用这种方式
dep.BirthDate.Invoke(myObj.SetProperty<DateTime>("birthday"));