Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
搜索并替换具有多个属性的对象中的值……C#_C# - Fatal编程技术网

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

搜索并替换具有多个属性的对象中的值……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

我有一个对象,当我调用数据库时,它会被填充。返回的结果包含文本字符串“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。感谢您,这里有一个循环的替代方法:使用隐式运算符,并使用类包装字符串:

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如何使用它……至少隐式运算符方法不是这样的糟糕。另外,反射方法听起来很糟糕,在数据库中解决问题时会使域膨胀,应该是最终的解决方案。