【问题标题】:C# cast a string to an objectC# 将字符串强制转换为对象
【发布时间】:2011-01-02 01:31:26
【问题描述】:

在 WPF 应用程序中,我有从自定义控件派生的对象:

...
<MyNamespace:MyCustControl x:Name="x4y3" />
<MyNamespace:MyCustControl x:Name="x4y4" />
... 

我可以使用名称来引用这些对象:

x4y4.IsSelected = true;

这样的功能也很好用:

 public void StControls(MyCustControl sname)
    {
     ...          
        sname.IsSelected = true;
     ...
    }

....

 StControls(x4y3);

但是我想在调用这个方法时使用一个字符串来引用一个对象。像这样(但这不起作用):

        MyCustControl sc = new MyCustControl();
        string strSc = "x1y10";
        sc.Name = strSc;

        StControls(sc); // nothing's happening

而且这种方式甚至无法编译:

        MyCustControl sc = new MyCustControl();
        string strSc = "x1y10";
        sc = (MyCustControl) strSc; // Cannot convert type string to MyCustControl 

        StControls(sc); 

如何使用string 变量来操作对象(即将其转换为对象)?

【问题讨论】:

    标签: c# wpf string object types


    【解决方案1】:

    这实际上不是强制转换。您需要通过名称找到控件的对象引用,可以这样完成:

    MyCustControl control = (MyCustControl)frameworkElement.FindName("x4y3");
    

    其中frameworkElement 是包含窗口(或任何像网格一样的面板)。从窗口后面的代码中,使用this 应该可以工作:)

    如果您打算改为动态创建控件,另请参阅this question,您的命名方案似乎向我建议。但是,如果是这种情况,FindName 根本就没有必要。您只需在创建控件时将所有已创建控件的引用存储在一个二维数组中。

    int[,] controls = new int[10, 10];
    
    for (int x = 0; x < 10; x++)
    {
        for (int y = 0; y < 10; y++)
        {
            // Create new control and initialize it by whatever means
            MyCustControl control = new MyCustControl();
    
            // Add new control to the container       
            Children.Add(control);
    
            // Store control reference in the array
            controls[x, y] = control;
        }
    }
    

    然后,您可以像这样访问控件:

    controls[4, 3].IsSelected = true;
    

    【讨论】:

    • 谢谢索拉林!安东尼的回答稍早一些,所以我接受了他的回答。您的代码示例将对我有很大帮助。再次感谢! +1
    【解决方案2】:

    使用FindName:-

     MyCustControl sc = (MyCustControl)this.FindName("x1y10");
    

    当您在 XAML 中使用 x:Name 时,将在与 cs 后面代码中的类匹配的部分类中创建具有指定名称的字段。这个部分类是找到 InitialiseComponent 的实现的地方。在执行此方法期间,找到具有该名称的对象并将其分配给该字段,FindName 用于执行此操作。

    当你有一个包含这样一个名称的字符串时,你可以简单地自己调用FindName,然后将返回的对象转换为自定义控件类型。

    【讨论】:

    • 此代码给出了运行时错误:“对象引用未设置为对象的实例”。并且:“使用 NEW 关键字创建对象实例”。我尝试使用 NEW 关键字 - 但它没有帮助。它可以是什么?
    • @rem:您在 XAML 中有一个名为“x1y10”的控件?
    • @rem:该错误在示例行中毫无意义。除了this之外,没有对象引用,但使用不当会导致编译时错误。很可能sc 变量设置为null,因为没有找到该控件,并且当您稍后在代码中尝试访问该控件时会发生异常。
    • 非常抱歉 - 这是我的对象名称拼写错误。 XAML 中确实没有这样的对象。一切运作良好。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2011-09-30
    • 2018-11-27
    相关资源
    最近更新 更多