动态清洁方法

时间:2017-09-14 18:54:01

标签: c# methods dynamic clear

提供了第一个条件,但是当我不能参考第二个条件参数时,无法传输更改。不幸的是,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);

此代码可以使用,但不会为变量赋值。

1 个答案:

答案 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;一个字符串变量是 - 如果你想解决支持引用类型,那么重载是不必要的。