动态清洁方法

问题描述:

提供了第一个条件,但是当我无法引用第二个条件参数时,无法传输更改。不幸的是,ref关键字不能用于params。我还能如何提供这两种操作?动态清洁方法

internal static void Clear(params dynamic[] ctrl) 
    { 
     for (int i = 0; i < ctrl.Length; i++) 
      if (ctrl[i].GetType().GetProperty("Text") != null) 
       ctrl[i].Text = ""; 
      else if (ctrl[i] is string) 
       ctrl[i] = ""; 
    } 

实施例:

一个注册后,我想和一个单一的方法来删除在文本框中的值。 使用:如果发现参数中的Text属性

Clear (txtName, txtsurn average, txtPhone, txtAddress); 

的方法将清除。 这部分工作正常。如果在使用对象时使用变量,则分配给变量的新值将保留在方法中,因为我们没有获取引用。本节不能很好地完成这项工作,所以我正在寻找解决方案。 使用: 考虑以下参数作为字符串类型的变量。

Clear (Name, Surname, Phone, Address); 

此代码将工作,但不会为变量分配新值。

+2

这是不是很清楚你在问什么。这段代码的目的是什么?你试图达到什么样的目标以及你面临的是什么问题?请提供一些具体的细节。 –

+0

如果我得到任何对象作为参数,如果Text属性存在,清除它。 如果对象没有Text属性,请清除该字符串。例如:清除(txtName,txtSurname,txtPhone); – Emre

+0

请先阅读。当你不明白时,不要投反对票。 – Emre

您的字符串问题(或任何值类型真的)是字符串是不可变的param值总是按值传递。当您使用params,什么编译器的作用是创造价值的一个数组被传递给方法,所以

Clear (Name, Surname, Phone, Address); 

转换为:

object[] temp = new object[] {Name, Surname, Phone, Address}; 
Clear(temp); 

而且由于字符串引用是按值传递,原始Name变量与没有连接,该值存储在数组中并传递到Clear。换言之,当Clear改变ctrl[0]的值时,存储在Name中的字符串不变(或者更确切地说,Name引用到内存中的相同字符串)。

一个选项是有几个重载与ref参数的各种数字:

internal static void Clear(ref object obj1) 
{ 
    object temp = null; 
    Clear(ref obj1, ref temp); 
} 
internal static void Clear(ref object obj1, ref object obj2) 
{ 
    object temp = null; 
    Clear(ref obj1, ref obj2, ref temp); 
} 
internal static void Clear(ref object obj1, ref object obj2, ref object obj3) 
{ 
    object temp = null; 
    Clear(ref obj1, ref obj2, ref obj3, ref temp); 
} 

internal static void Clear(ref dynamic obj1, ref dynamic obj2, ref dynamic obj3, ref dynamic obj4) 
    { 
     void Check(ref dynamic obj) 
     { 
      if (obj.GetType().GetProperty("Text") != null) 
       obj.Text = ""; 
      else if (obj is string) 
       obj = ""; 
     } 
     Check(ref obj1); 
     Check(ref obj2); 
     Check(ref obj3); 
     Check(ref obj4); 
    } 

显然这限制了你可以带参数的数量,但没有ref param等同于C#。

这就是说,我没有看到“清除”字符串变量的值是什么 - 如果你想解决只支持引用类型那么过载是不必要的。

+0

感谢您的关注和您的回复。 是的我知道'ref params'不能一起使用。 我试图找到一个不限制数组参数的替代方法。 不幸的是,我们需要事先设置一个限制。 我们已经创建了一个方法,可以通过更改最后一个方法来执行任何我想要的操作,如下所示。但是,参数有限。 – Emre

+0

我编辑了你的答案。再次感谢您。 – Emre