搜索并替换具有多个属性的对象中的值……C#
我有一个对象,当我调用数据库时,它会被填充。返回的结果包含文本字符串“NULL”。我的对象中有大约40个被填充的属性。我如何循环使用空字符串替换字符串“NULL”中的所有对象,而不用像这样做:搜索并替换具有多个属性的对象中的值……C#,c#,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 = st
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。感谢您,这里有一个循环的替代方法:使用隐式运算符,并使用类包装字符串:
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。空自动:
YourClass some = new YourClass();
some.AddressLine = "NULL"; // This will store an empty string (i.e. "")
您可以设置字符串类型的变量:
string addressLine = some.AddressLine;
这个解决方案可能需要一些重构,但它的性能比使用反射更高。另一种选择,因为您说您无法控制“gethedata”和它的返回类型(而且您可能正在使用某种ORM),它将创建一个sql视图来完成您需要的任务,从而将您自己与外部环境隔离开来“NULL”奇怪。将您的ORM映射到视图,而不是它当前映射到的任何对象。当然,如果源代码发生了很大变化,那么管理它就没有意思了
一个简单的字符串扩展方法能满足您的需要吗?例如,t.Address1.NullAsEmpty()?你能说明对象的结构是什么吗..它在类中吗..如果是这样,我可以为你提供一种简单快速的方法,只要类型是类的..如果这是一个对象..为什么你不能使用字符串.替换函数来做..你能说明从快速观察上传屏幕截图时是什么样子吗。。?ttt是一个数据表吗?如果是这样的话,这更容易完成再次阅读这个问题,null
和“null”
应该检查if(p.PropertyType==typeof(string)
@MethodMan再次查看我的答案。我不知道他对哪些属性感兴趣。他需要更新我的解决方案以满足他的需要。@neo-我喜欢你的答案,我只需要在属性中获得p的类型,因为编译器不会按原样编译你的代码,当我将其转换为字符串时,如果p不是string类型,应用程序就会抛出一个错误。@boundForColory我更新了我的答案。它检查属性类型是否为字符串,然后检查值是否为“NULL”@neo-如果(p.GetValue(p,NULL).ToString()=“NULL”)我得到的对象与目标类型不匹配,则在这一行上检查值是否为“NULL”"。我正在查找此错误。如果该类是由EF之类的工具生成的,OP是否应该手动将所有字符串属性更改为NullableString
?@Eser Search&Replace以进行营救。顺便说一句,我没有看到一个关于这个问题的答案……@Eser您和我都不知道实际OP的域。也许OP的类少于10个或300个。顺便说一句,如果没有呢ING生成和OP首先使用代码吗?或者如果OP使用的是一个类似于ORM的小说家?如果不是猜测,我只是想添加一个反射的替代物!@ ESEBTW,我没有看到“由工具生成”。当我建议进行搜索和替换时。没有解决方案,因为每次重新生成、模型更新或其他任何操作都会破坏更改。@Eser无论如何,同样,因为我们不知道OP是否使用or/M,如果OP使用某个or/M,我们不知道详细的是哪一个,OP如何使用它……至少隐式运算符方法不是这样的糟糕。另外,反射方法听起来很糟糕,在数据库中解决问题时会使域膨胀,应该是最终的解决方案。