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

时间:2015-11-18 14:14:17

标签: c# wpf

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

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

1 个答案:

答案 0 :(得分:0)

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

首先,您需要一个适合您的经理实施的界面。

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

当然,你需要一些实现:

public class UserManager : IManager
{
    //IManager methods
}

然后,您需要一个可以容纳TabItem的{​​{1}}。这是一个例子:

IManager

您可能想要阅读自定义控件,您可以找到一个很好的教程here

现在,要将所有内容整合在一起,您只需使用新的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))); } } 替换现有的TabItem并分配ManagedTabItem属性。

Manager

上述方法假设您正在使用<local:ManagedTabItem Manager="{Binding UserManager}" ... /> DataContext。否则,您当然可以在代码后面执行此操作:

Binding

这种方法很漂亮,现在你需要检查点击了哪个 myTabItem.Manager = UserManager; ,而你可以简单地调用你需要的任何方法在标签的指定经理上。

TabItem

这是一个非常大的解决方法,但是保持可扩展性并允许更改 没有任何问题。