如何将字符串变量的值作为实例名称? 这是一些代码:
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()
函数, UnselectAll
,RemoveSelected
。现在我不想创建这样的东西:
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);
答案 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
这是一个非常大的解决方法,但是保持可扩展性并允许更改 没有任何问题。