2015-11-18 24 views
0

如何将字符串变量的值作为实例名称? 下面是一些代码:C#使用字符串查找已存在的对象实例

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

但我认为这种方式不是很好,因为我会再次需要很多if/else。

我需要的是这样的:

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

没有办法*查找*实例。这是你必须提供它。考虑在创建一个列表时将实例放入某个列表(例如,'Static List ')。如果你想通过使用该字符串来找到它,它可以是一个'Dictionary <字符串,SomeBaseTypeOrInterface>'。 – Sinatr

+0

继续使用您的解决方案,提供您想要的完全不可读,杂乱的代码。只是在说'… –

回答

0

这是什么,可以通过使用扩展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))); 
    } 
} 

你可能想在自读了控制,你可以找到一个很好的教程here


现在,带来这一切一起,你只需要简单地替换现有TabItemManagedTabItem并分配Manager财产。

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

上述方法假设你正在使用的DataContextBinding。否则,你当然可以在代码中做到这一点,而不是背后:

myTabItem.Manager = UserManager; 

这种方法的好处是现在你需要检查TabItem被点击,而不是你可以简单地调用任何方法你需要在标签的分配管理器上。

ManagedTabItem selectedTabItem = this.mainTabControl.SelectedItem as ManagedTabItem; 

if (btnSelectAll == pressed) 
{ 
    selectedTabItem.Manager.SelectAll(); 
} 
... 

这是一个相当大的解决方法,但有什么不对保持事物扩展性和允许更改为容易

相关问题