【问题标题】:How can i find a specific element/field in the class如何在类中找到特定元素/字段
【发布时间】:2014-09-08 16:23:56
【问题描述】:

我有 2 页应用程序。第一页 MainPage,第二页是类和名称“链接”。我在主页上有按钮。我在“链接”中有与按钮同名的字符串变量。 例如

class Links
{      
    public static string a1 = "data1";
    public static string a2 = "data2";
    public static string a3 = "data3";
}

//Main page
public partial class MainPage
{
    // Constructor
    public MainPage()
    {
        InitializeComponent();            
    }

    private void allclickevents(object sender, RoutedEventArgs e)
    {
       Button x = (Button)sender;
       string findthisname=x.Content.ToString();
       //I need to find the string data of the same name in "Links" class. And show messagebox, for ex if button a2 messagebox shows "data2".
    }
}

设计页面(Xaml 页面):

<Button x:Name="a1" Content="a1" HorizontalAlignment="Left" Margin="260,48,0,0" VerticalAlignment="Top" Click="allclickevents"/>
<Button x:Name="a2" Content="a2" HorizontalAlignment="Left" Margin="360,48,0,0" VerticalAlignment="Top" Click="allclickevents"/>
<Button x:Name="a3" Content="a3" HorizontalAlignment="Left" Margin="460,48,0,0" VerticalAlignment="Top" Click="allclickevents"/>

所有按钮单击事件都设置为allclickevents 方法,我正在使用(按钮)。发件人并找到特定的按钮名称。只需要在 Links 类中找到相同的命名字符串数据。 我需要在“Links”类中找到同名的字符串数据。并显示消息框,例如如果按钮 a2 消息框显示 data2。请帮忙。

【问题讨论】:

  • x 在您声明它的实例后是否具有 Name 或 ID 属性..?如果 Button 具有 Tag 属性,那么您也可以执行以下操作 var name = ((Button)sender).Tag;

标签: c# button findcontrol


【解决方案1】:

做到这一点的唯一方法是通过反射,这是一个很好的指标,表明它不是解决整体问题的正确方法。

话虽如此,下面的代码会做到这一点:

string data = (string) typeof(Links).GetField(findthisname).GetValue(null);

请参阅MSDN 了解GetFieldSO 了解如何使用它来访问静态成员。

要获取消息框,只需使用MessageBox.Show(data)

【讨论】:

  • 但字符串数据不是对象 错误 1 ​​无法将类型“对象”隐式转换为“字符串”。存在显式转换(您是否缺少演员表?),我尝试 var data = typeof(Linkler).GetField(findthisname);但只有数据类型(在消息框中)输出:“string[]”
  • @DesperadoMurat 是的,使用反射你需要明确地转换为正确的类型(另一个原因它不是正确的方法!)更新了我的答案以添加它
  • 它的工作!干得好,感谢您的回答,对不起,我是菜鸟,不知道一些想法:) 我尝试了这个并且工作完美: string[] data = (string [])typeof(Linkler).GetField(findthisname).GetValue(null); ; MessageBox.Show(data[0]);
  • @DesperadoMurat 我希望这能奏效。由于您仍在学习,我会尝试找到一种不需要需要反思的方法。如果你这样做,你最终会得到更好的设计和更好的代码!
【解决方案2】:
        FieldInfo f_key = typeof(Links).GetField(p);
        var o = f_key.GetValue(null);

这些代码应该可以工作,但如果你使用字典,它会容易得多,像这样:

        Dictionary<String,String> links = new Dictionary<string, string>();
        links.Add("a1","data1");
        links.Add("a2", "data2");
        links.Add("a3", "data3");

当你使用它时:

links["ai"] 将返回 "datai"

【讨论】:

  • 我不确定如何处理这个答案。您提供了一个很好的建议(字典),尽管他可能有充分的理由将它放在一个单独的对象中。反射代码虽然搞砸了,变量名不好,你不需要实例化一个“链接”对象(字段是静态的)。如果你改进它,我会考虑投票。
猜你喜欢
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
相关资源
最近更新 更多