提供了第一个条件,但是当我不能参考第二个条件参数时,无法传输更改。不幸的是,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] = "";
}
示例:
注册后,我想用一个方法删除文本框中的值。 使用:
Clear (txtName, txtsurn average, txtPhone, txtAddress);
如果在参数中找到Text属性,该方法将清除。 这部分工作正常。如果在使用对象时使用变量,则分配给变量的新值将保留在方法中,因为我们没有获得引用。这部分不能很好地完成这项工作,所以我正在寻找解决方案。 使用: 将以下参数视为string类型的变量。
Clear (Name, Surname, Phone, Address);
此代码可以使用,但不会为变量赋值。
答案 0 :(得分:0)
您对字符串(或任何值类型)的问题是字符串是不可变的,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);
}
显然这限制了您可以拥有的参数数量,但C#中没有ref param
等效。
那就是说,我没有看到&#34;清算&#34;一个字符串变量是 - 如果你想解决只支持引用类型,那么重载是不必要的。