用多个属性搜索和替换对象中的值…c#

本文关键字:对象 替换 属性 搜索 | 更新日期: 2023-09-27 18:13:00

我有一个对象,当我调用数据库时得到填充。返回的结果包含字符串"NULL"。我的对象中大约有40个属性被填充。我如何循环替换所有对象与字符串"NULL"与空字符串没有做这样的古老的方式:

var ttt =  GetTheData();
foreach (var t in ttt)
{
    if (t.AddressLine1 == "NULL") t.AddressLine1 = string.Empty;
    if (t.City == "NULL") t.City = string.Empty;
   //so forth and so on
}

不,我不能控制返回的数据。所以,是的,合乎逻辑的方法是在db级别修复它。我希望有人遇到这个问题,并找到一个更好的解决方案。顺便说一句,我使用的是。net 4.0。提前感谢

用多个属性搜索和替换对象中的值…c#

var ttt =  GetTheData();
foreach (var t in ttt)
{
    var properties = t.GetType().GetProperties();
    foreach(var p in properties){
       if(p.PropertyType.Name.Equals("String")){
          if(p.GetValue(t,null).ToString() == "NULL")
             p.SetValue(t,string.Empty,null);
       }
    }
}

还有一种替代循环的方法:使用隐式操作符,并使用类来包装字符串:

public sealed class NullableString
{
    private readonly string _value;
    private NullableString(string value)
    {
         _value = value;
    }
    private string Value { get { return _value; } }
    public static implicit operator string(NullableString nullableString)
    {
          return nullableString.Value;
    }
    public static implicit operator NullableString(string value)
    {
          if(value == "NULL")
               value = string.Empty;
          return new NullableString(value);
    }
    public override string ToString()
    {
          return Value;
    }
}
现在,你的类应该这样声明它的属性:
public class YourClass
{
     public NullableString AddressLine { get; set; }
}

由于NullableString有一个隐式运算符来隐式地将常规string转换为NullableString,反之亦然,如果常规string带有NULL字面值,它将自动转换为string.Empty:

YourClass some = new YourClass();
some.AddressLine = "NULL"; // This will store an empty string  (i.e. "")

你可以设置一个string类型的变量:

string addressLine = some.AddressLine;

这个解决方案可能需要一些重构,但它将比使用反射性能更好。

另一种选择,因为你说你无法控制"GetTheData"和它的返回类型(似乎你可能使用某种ORM)将创建一个sql视图,做你需要的,从而使自己免受"NULL"的奇怪。将ORM映射到视图,而不是当前映射到的任何视图。当然,如果源代码改变了很多,那么管理起来就不那么有趣了。

一个简单的字符串扩展方法能满足你的需要吗?例如t.Address1.NullAsEmpty () ?