搜索和替换具有多个属性的对象中的值...... C#

时间:2015-09-16 20:18:03

标签: c#

我有一个对象在我调用数据库时被填充。返回的结果包含文字字符串" 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
}

不,我无法控制回来的数据。所以是的逻辑方法是在数据库级别修复它。我希望有人遇到这个并找到了更好的解决方案。我使用.NET 4.0顺便说一下。提前致谢

3 个答案:

答案 0 :(得分:4)

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);
       }
    }
}

答案 1 :(得分:0)

可以替代循环:使用隐式运算符,并使用类来包装字符串:

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;

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

答案 2 :(得分:0)

另一种选择,因为你说你无法控制" GetTheData"它的返回类型(似乎你可能正在使用某种ORM)就是创建一个sql视图来完成你需要的东西,从而使你自己与'#34; NULL"怪事。将您的ORM映射到视图而不是它当前映射到的视图。当然,如果来源变化很大,那么管理就不会有趣。

字符串上的简单扩展方法是否符合您的需求?例如。 t.Address1.NullAsEmpty()?