C#使用字符串查找已存在的对象实例

本文关键字:存在 对象 实例 查找 字符串 | 更新日期: 2023-09-27 18:22:20

如何将字符串变量的值作为实例名称?这里有一些代码:

    TabItem selectedTabItem = this.mainTabControl.SelectedItem as TabItem;
    Type t = selectedTabItem.DataContext.GetType();
    object instance = Activator.CreateInstance(t);
    MethodInfo method = t.GetMethod("SelectAll");
    //Here is the problem
    method.Invoke(t, null);

它存在5个不同的类(UserManager.cs、GroupManager.cs,PrinterManager.cs和FontManager.cs…),每个类都有函数SelectAll()UnselectAllRemoveSelected。现在我不想创建这样的东西:

        TabItem selectedTabItem = this.mainTabControl.SelectedItem as TabItem;
        if (selectedTabItem.Name == "UserManager")
        {
            if (btnSelectAll == pressed)
            {
                this.UserManager.SelectAll();
            }
            else if (btnUnselectAll == pressed)
            {
                this.UserManager.UnselectAll();
            }
            else if (btnRemoveSelected == pressed)
            {
                this.UserManager.RemoveSelected();
            }
        }
        else if (selectedTabItem.Name == "PrinterManager")
        {
            if (btnSelectAll == pressed)
            {
                this.PrinterManager.SelectAll();
            }
            //...
        }
        else if (selectedTabItem.Name == "GroupManager")
        {
        }
        //...

现在这行在这里:

method.Invoke(t, null);

它工作得很好,但我不想创建一个新的实例。我需要一个现有的实例。现在我可以写了

method.Invoke(this.UserManager, null);

但我认为这种方式不太好,因为如果/否则我会再次需要很多。

我需要这样的东西:

string instance = "this.UserManager";
method.Invoke(instance, null);

C#使用字符串查找已存在的对象实例

这可以通过使用扩展TabItem自定义控件来解决。此自定义TabItem将需要为其分配管理器

首先,您需要一个用于管理器实现的接口。

public interface IManager
{
    SelectAll();
    UnselectAll();
    RemoveSelected();
}

当然,您需要一些实现:

public class UserManager : IManager
{
    //IManager methods
}

然后,您将需要一个TabItem,它可以容纳一个IManager。这里有一个例子:

public class ManagedTabItem : TabItem
{
    public IManager Manager
    {
        get { return (IManager)GetValue(ManagerProperty); }
        set { SetValue(ManagerProperty, value); }
    }
    public static readonly DependencyProperty ManagerProperty =
        DependencyProperty.Register("Manager", typeof(IManager), typeof(ManagedTabItem), new PropertyMetadata(null));
    static ManagedTabItem()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(ManagedTabItem), new FrameworkPropertyMetadata(typeof(ManagedTabItem)));
    }
}

您可能想阅读自定义控件,您可以在这里找到一个很好的教程。


现在,要将这一切结合在一起,只需用新的ManagedTabItem替换现有的TabItem,并分配Manager属性。

<local:ManagedTabItem Manager="{Binding UserManager}" ... />

以上方法假设您正在使用DataContextBinding。否则,你当然可以在代码背后这样做:

myTabItem.Manager = UserManager;

该方法的美妙之处在于,现在您不需要检查点击了哪个TabItem,而是可以在选项卡的指定管理器上调用所需的任何方法。

ManagedTabItem selectedTabItem = this.mainTabControl.SelectedItem as ManagedTabItem;
if (btnSelectAll == pressed)
{
    selectedTabItem.Manager.SelectAll();
}
...

这是一个相当大的解决方案,但保持事物的可扩展性并允许更改变得简单并没有错。