我遇到了一个问题,我控制之外的代码类使用的是null,所以当它们被引用时,例如“string.Length”会导致错误。而不是使用嵌套类对平均可能的100个字段进行检查,我想也许我可以创建更容易的东西。我有个主意......
如果您对复制对象PropertyCopy以及其他一些对象进行了任何研究,那么这是一个非常常见的发现。我目前使用上面提到的类。我想知道它是否可以修改为简单地去: 如果stringPropertyValue为null,则将stringPropertyValue设置为等于string.Empty。
我的理解有限。我一直在研究解决我的问题,但没有真正的好主意。我的想法能起作用吗?有没有更好的办法?如果它可以怎么做?
更新:
根据下面的回复,我创建了这个我目前要使用的课程。
public static void DenullifyStringsToEmpty<T>(this T instance)
{
//handle properties
foreach (var filteredProperties in instance.GetType().GetProperties().Where(p =>
(p.PropertyType.IsClass || p.PropertyType.IsInterface || p.PropertyType == typeof(string))))
{
if (filteredProperties.PropertyType == typeof(string))
{
if (filteredProperties.GetValue(instance, null) == null)
{
filteredProperties.SetValue(instance, string.Empty, null);
}
}
else
{
filteredProperties.GetValue(instance, null).DenullifyStringsToEmpty();
}
}
//handle fields
foreach (var filteredFields in instance.GetType().GetFields().Where(f =>
(f.FieldType.IsClass || f.FieldType.IsInterface || f.FieldType == typeof(string))))
{
if (filteredFields.FieldType == typeof(string))
{
if (filteredFields.GetValue(instance) == null)
{
filteredFields.SetValue(instance, string.Empty);
}
}
else
{
filteredFields.GetValue(instance).DenullifyStringsToEmpty();
}
}
}
我知道反思可能很重,在我们遇到问题之前,我认为这个解决方案会很有效。这是一个扩展(感谢下面的评论)。
感谢您的投入。
答案 0 :(得分:2)
难道你不能只创建一个简单的扩展方法吗?
public static string NullToEmpty(this string possibleNullString)
{
return possibleNullString ?? string.Empty;
}
在访问该第三方类的字符串属性时使用它,例如:
var length = instanceOfThirdPartyClass.StringProperty.NullToEmpty().Length;
<强>更新强>
现在我明白了你想要的东西;-)
看看这个:
public static void DenullStringProperties<T>(this T instance)
{
foreach(var propertyInfo in instance.GetType().GetProperties().
Where(p => p.PropertyType == typeof(string))
{
var value = propertyInfo.GetValue(instance, null);
if(value == null)
value = string.Empty;
propertyInfo.SetValue(instance, value, null);
}
}
您可以这样称呼它:
instanceOfThirdPartyClass.DenullStringProperties();
但我仍然认为你应该选择第一种方法,因为我真的没有理由在运行时做这么繁重的事情(反射并不便宜),只是因为你在开发过程中懒得打字:)此外,在调用DenullStringProperties
(多线程,调用对象的方法,...)之后,您无法确定属性是否保持非null。第一种方法检查null并根据需要处理它。