PropertyCopy通常将字符串值从Null更改为Empty

时间:2011-03-31 15:19:38

标签: c# linq

我遇到了一个问题,我控制之外的代码类使用的是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();
            }
        }
    }

我知道反思可能很重,在我们遇到问题之前,我认为这个解决方案会很有效。这是一个扩展(感谢下面的评论)。

感谢您的投入。

1 个答案:

答案 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并根据需要处理它