我有一个对象在我调用数据库时被填充。返回的结果包含文字字符串" 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顺便说一下。提前致谢
答案 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()?