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条件,字符串值)
这样的流体接口)。