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()
、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);
这可以通过使用扩展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}" ... />
以上方法假设您正在使用DataContext
和Binding
。否则,你当然可以在代码背后这样做:
myTabItem.Manager = UserManager;
该方法的美妙之处在于,现在您不需要检查点击了哪个TabItem
,而是可以在选项卡的指定管理器上调用所需的任何方法。
ManagedTabItem selectedTabItem = this.mainTabControl.SelectedItem as ManagedTabItem;
if (btnSelectAll == pressed)
{
selectedTabItem.Manager.SelectAll();
}
...
这是一个相当大的解决方案,但保持事物的可扩展性并允许更改变得简单并没有错。