Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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#,我创建的对象如下所示: MyObjectClass obj = new MyObjectClass(); foreach( .... ) { if( condition1 ) FillMyObjectWith(obj, "hello", "", ""); if( condition2) FillMyObjectWith(obj, "" , "hello" , ""); } ///// private void FillMyObjectWith(MyobjectCl

我创建的对象如下所示:

MyObjectClass obj = new MyObjectClass();
foreach( .... )
{
   if( condition1 )
     FillMyObjectWith(obj, "hello", "", "");
   if( condition2)
    FillMyObjectWith(obj, "" , "hello" , "");
}
/////

private void FillMyObjectWith(MyobjectClass obj, string val1, string val2, string val3)
{
  obj.Field1 = val1;
  obj.Field2 = val2;
  obj.Field3 = val3;
}
foreach( .... )
{
   if ( condition1 && condition2)
      FillMyObjectWith(obj, "hello", "hello", "");
   else if( condition1 )
      FillMyObjectWith(obj, "hello", "", "");
   else if( condition2)
      FillMyObjectWith(obj, "" , "hello" , "");
}
请注意,我对if条件使用了而不是
“else”
,因为在该
中,对于每个循环
,两个条件也可以是
真的
,因此当
条件1
真时,我将“hello”传递给
字段1
,并将空白传递给其他两个字段,当
condition2
为true时,我将“hello”传递给
Field2
,其余字段为空。 问题是,如果两个条件都为真,则最后一次调用将用空字符串覆盖其中一个字段的“hello”值。
如何避免这种情况?

您可以这样做:

MyObjectClass obj = new MyObjectClass();
foreach( .... )
{
   if( condition1 )
     FillMyObjectWith(obj, "hello", "", "");
   if( condition2)
    FillMyObjectWith(obj, "" , "hello" , "");
}
/////

private void FillMyObjectWith(MyobjectClass obj, string val1, string val2, string val3)
{
  obj.Field1 = val1;
  obj.Field2 = val2;
  obj.Field3 = val3;
}
foreach( .... )
{
   if ( condition1 && condition2)
      FillMyObjectWith(obj, "hello", "hello", "");
   else if( condition1 )
      FillMyObjectWith(obj, "hello", "", "");
   else if( condition2)
      FillMyObjectWith(obj, "" , "hello" , "");
}

您可以这样做:

MyObjectClass obj = new MyObjectClass();
foreach( .... )
{
   if( condition1 )
     FillMyObjectWith(obj, "hello", "", "");
   if( condition2)
    FillMyObjectWith(obj, "" , "hello" , "");
}
/////

private void FillMyObjectWith(MyobjectClass obj, string val1, string val2, string val3)
{
  obj.Field1 = val1;
  obj.Field2 = val2;
  obj.Field3 = val3;
}
foreach( .... )
{
   if ( condition1 && condition2)
      FillMyObjectWith(obj, "hello", "hello", "");
   else if( condition1 )
      FillMyObjectWith(obj, "hello", "", "");
   else if( condition2)
      FillMyObjectWith(obj, "" , "hello" , "");
}
您可以尝试以下方法:

private void FillMyObjectWith(MyobjectClass obj, string val1, string val2, string val3)
    {
        if (!string.IsNullOrEmpty(val1))
            obj.Field1 = val1;
        if (!string.IsNullOrEmpty(val2))
            obj.Field2 = val2;
        if (!string.IsNullOrEmpty(val3))
            obj.Field3 = val3;
    }

您可以尝试以下方法:

private void FillMyObjectWith(MyobjectClass obj, string val1, string val2, string val3)
    {
        if (!string.IsNullOrEmpty(val1))
            obj.Field1 = val1;
        if (!string.IsNullOrEmpty(val2))
            obj.Field2 = val2;
        if (!string.IsNullOrEmpty(val3))
            obj.Field3 = val3;
    }


看起来您在每个条件上只设置了一个值,其余的都为空,所以一种方法是将方法签名更改为只接受三个参数。一个携带您要设置的值,一个是
枚举
,您将其标记为显示分配值的位置,然后在方法中检查该
枚举
,并根据该值分配值

FillMyObjectWith(MyobjectClass obj, string val1, Enum )

看起来您在每个条件上只设置了一个值,其余的都为空,所以一种方法是将方法签名更改为只接受三个参数。一个携带您要设置的值,一个是
枚举
,您将其标记为显示分配值的位置,然后在方法中检查该
枚举
,并根据该值分配值

FillMyObjectWith(MyobjectClass obj, string val1, Enum )

@JohnnyMopp也有一些情况,可能其中只有一个是真的……所以我想用“hello”来填充它Field@JohnnyMopp也有一些情况,可能其中只有一个是真的……所以我希望为该字段填充“hello”,但如果我不将值传递给某些参数,我仍然希望它们在对象属性中为string.empty。+1。只要元素有安全的“not there”值,这就是合理的方法(对于
int?
之类的值类型使用nullable非常有效)。。。当null是属性的有效值时,这对引用类型不起作用。但是如果我不将值传递给某些参数,我仍然希望它们在对象属性中为string.empty。+1。只要元素有安全的“not there”值,这就是合理的方法(对于
int?
之类的值类型使用nullable非常有效)。。。当null是属性的有效值时,这不适用于引用类型。+0:对于3个条件
2^3-1
条件。。。无法真正扩展到超过2个条件的情况下(其中内联
?:
可能会更好)…@AlexeiLevenkov您的意思是
使用(obj,condition1?“hello”:“”,condition2?“hello”:“”)
?是的,类似的内容-如果在每行上格式化,可能会可读。。。(C风格的解决方案可能比重新实现
JQuery.extend
要好得多,比如
MyobjectClass SetFieled2WhenTrue(bool条件,字符串值)
)。+0:对于3个条件
2^3-1
条件。。。无法真正扩展到超过2个条件的情况下(其中内联
?:
可能会更好)…@AlexeiLevenkov您的意思是
使用(obj,condition1?“hello”:“”,condition2?“hello”:“”)
?是的,类似的内容-如果在每行上格式化,可能会可读。。。(另外,C风格的解决方案可能比重新实现
JQuery.extend
要好得多,可能是像
MyobjectClass SetFieled2WhenTrue(bool条件,字符串值)
这样的流体接口)。