如何在C#中将对象的名称作为参数传递给函数?

时间:2009-12-07 13:06:51

标签: c# function parameters methods

我有一些代码可以在mouseclick上改变boolean属性的状态,具体取决于被点击对象的名称:

private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        FrameworkElement feSource = e.Source as FrameworkElement;
        switch (feSource.Name)
        {
            case "r1s1":
                if (r1s1.IsSelected == false)
                    r1s1.IsSelected = true;                 
                else
                    r1s1.IsSelected = false;
                break;
            case "r1s2":
                if (r1s2.IsSelected == false)
                    r1s2.IsSelected = true;
                else
                    r1s2.IsSelected = false;
                break;
            .............
        }
        e.Handled = true;
    }

我想做同样的操作,将发送者的名称(r1s1,r1s2,..等)作为参数来运行,此字符串与属性名称(IsSelected)结合,只是为了优化代码。这样的事情(只是想法):

private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        FrameworkElement feSource = e.Source as FrameworkElement;

        ChangeSelection (feSource.Name)
    }


public void ChangeSelection(string name)
    {
        if (name.IsSelected == false)
            name.IsSelected = true;
        else
            name.IsSelected = false;
    }

拜托,纠正我。我做错了什么?

4 个答案:

答案 0 :(得分:2)

我在WPF上并不出色,但我相信您希望将feSource传递给ChangeSelection。然后将它转换为它的“真实”类型,是这个CheckBox或其他任何东西,然后修改它上面的.IsSelected属性。

当你将真实对象作为参数(对象发送者)时,我不知道你为什么要这样做。

答案 1 :(得分:2)

您可能只想将目标引用存储在每个项目的“tag”属性中。那么你就不会有所有魔法字符串传递。

答案 2 :(得分:2)

您希望按名称访问控件。以下代码假定您的控件是“RadioButton”,并且您的代码位于表单上。

    public void ChangeSelection(string name)
    {
        if (this.Controls.ContainsKey(name))
        {
            RadioButton radio1 = this.Controls[name] as RadioButton;
            radio1.IsSelected = !radio1.IsSelected;
        }
    }

答案 3 :(得分:1)

您传递给函数的是一个字符串。因此,当您尝试在函数中寻址name.IsSelected时,您正在寻找String.IsSelected方法(是否存在?)

你在top函数中声明r1s1和r1s3的位置?这些是您应该尝试调用的对象.IsSelected on。

语法糖评论:

public void ChangeSelection(string name)
{
   // resolve object from name here
   feObject.IsSelected = ! feObject.IsSelected;
}