动态清洁方法
问题描述:
提供了第一个条件,但是当我无法引用第二个条件参数时,无法传输更改。不幸的是,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);
此代码将工作,但不会为变量分配新值。
答
您的字符串问题(或任何值类型真的)是字符串是不可变的和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#。
这就是说,我没有看到“清除”字符串变量的值是什么 - 如果你想解决只支持引用类型那么过载是不必要的。
这是不是很清楚你在问什么。这段代码的目的是什么?你试图达到什么样的目标以及你面临的是什么问题?请提供一些具体的细节。 –
如果我得到任何对象作为参数,如果Text属性存在,清除它。 如果对象没有Text属性,请清除该字符串。例如:清除(txtName,txtSurname,txtPhone); – Emre
请先阅读。当你不明白时,不要投反对票。 – Emre