【问题标题】:How in C# to pass a name of the object as a parameter to function?如何在 C# 中将对象的名称作为参数传递给函数?
【发布时间】:2010-12-24 00:14:59
【问题描述】:

我有在鼠标点击时更改布尔属性状态的代码,具体取决于点击对象的名称:

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;
    }

请纠正我。我做错了什么?

【问题讨论】:

  • 不清楚实际的sender 是否是需要切换的复选框/收音机,或者您有一组单独的对象应该被选中?如果是sender,那么您可以简单地将其转换为适当的控件并切换其状态。
  • 实际的“Sender”是一个具有自定义依赖属性“IsSelected”的 WPF 自定义控件。将其转换为适当的类型怎么样 - 我将深入研究一个理论,以实现这一点。没有代码示例,我很难理解这种方式
  • 在大家的帮助下完成了。非常感谢

标签: c# function parameters methods


【解决方案1】:

我在 WPF 方面并不出色,但我相信您希望将 feSource 传递给 ChangeSelection。然后将其转换为“真实”类型,无论是 CheckBox 还是其他类型,然后修改其上的 .IsSelected 属性。

我不知道为什么当你将真实对象作为参数(对象发送者)时,你为什么要通过名称来执行此操作。

【讨论】:

  • 只是缺乏 C# 经验使我无法更优雅地操作参数。我需要进一步学习:)
  • 谢谢!我已经设法用真实的对象完成了所有这些工作,按照你的建议使用我的对象类型进行转换。很酷。
【解决方案2】:

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

【讨论】:

  • 这个方法我得学一点。只是不太熟悉“标签”功能。无论如何,谢谢。
【解决方案3】:

您想通过名称访问控件。以下代码假定您的控件是“RadioButton”并且您的代码位于表单上。

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

【讨论】:

  • 感谢您直接回答我的新手问题。感谢代码示例,我真的需要它。我在实现这一点时遇到的问题是,我无法清楚地识别上下文中的“控件”是什么意思——它给了我不断的错误“..不包含'控件'的定义......”
【解决方案4】:

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

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

还有一个语法糖注释:

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

【讨论】:

  • 特别感谢您的语法糖评论。我的变种看起来很丑,现在我明白了:)
猜你喜欢
  • 1970-01-01
  • 2012-02-27
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多