我已经反编译了一个aplication exe来了解他们如何处理命令。但我不确切知道以下文件的类型。因为该文件是从继承自system.windows.forms.component的超类继承而且该文件在反射器中有资源(ExploreCommand.Resx)文件。
[DesignerCategory("Accurate Command Binders"), ToolboxItem(true), DesignTimeVisible(true)]
internal class ExplorerCommands : CommandBinder
{
// Fields
private static readonly ResourceManager resources = new ResourceManager(typeof(ExplorerCommands));
// Methods
protected ExplorerCommands()
{
}
public ExplorerCommands(Control control) : base(control)
{
}
// Properties
[Browsable(false)]
public Command AboutAccurate {
get
{
return base.GetCommandForCaller("AboutAccurate ", "CitraKarya.Bisnis.Akunting.UI.Explorer.AboutAccurate ", "");
}
}
在使用此类的每个表单上,他们都这样声明:
this.reportCommands = new CitraKarya.Akunitng.UI.ReportCommands(this);
但我不知道命令类是如何创建的。它们具有与资源类不同的语法。有谁能够帮我? 这是什么意思?如何实施这个案例?
Ough ..这是exploreCommand的基类:
CODE:
[DesignerCategory(""), DesignTimeVisible(false), Designer(typeof(CommandBinderDesigner), typeof(IDesigner)), ProvideProperty("Command", typeof(object)), TypeConverter(typeof(CommandBinderTypeConverter)), ToolboxItem(false)]
public abstract class CommandBinder : Component
{
// Methods
protected CommandBinder()
{
this.commands = new Dictionary<object, Command>();
this.InitializeComponent();
}
protected CommandBinder(Control parentControl)
{
this.commands = new Dictionary<object, Command>();
this.parentControl = parentControl;
IComponent component = parentControl;
if ((component.Site != null) && (component.Site.Container != null))
{
component.Site.Container.Add(this);
}
this.InitializeComponent();
}
protected Command GetCommandForCaller(string propertyName, string id, string category)
{
CommandManager commandManager = CommandManager;
Command command = null;
if (commandManager != null)
{
command = commandManager.Commands[id];
}
if (command == null)
{
command = CreateCommand(propertyName, id, category);
if (commandManager != null)
{
commandManager.Commands.Add(command);
return command;
}
CommandsToBeAdded.Add(command);
}
return command;
}
}
答案 0 :(得分:0)
资源的示例是将在应用程序中使用的字符串(文本),图像,图标等。可以将它们嵌入到程序集(exe / dll)中并从那里引用,而不是将它们作为不同的文件分发。在.NET中,资源管理器是一个辅助类来引用这些资源。同样,资源多次与特定类型(例如表单)相关联,并称为本地资源。在.NET中,本地资源按与其关联的类型进行分类 - 实质上,资源名称将具有关联的类型名称前缀。资源管理器将类型作为参数,然后您可以通过简单的名称/键(在类型名称中唯一)来引用相关资源。在您的情况下,您可以使用反射器查看与ExplorerCommands类型相关联的所有资源 - 它们将在特定resx下分类(或将具有诸如<Name space>.ExplorerCommands.<resource name>
之类的名称)
因此,资源通常与代码逻辑无关 - 它们只是指示应用程序需要使用的一些常量文本或图像。
我不知道命令类是如何创建的。
从代码中可以看出,派生自CommandBinder
的类公开了命令的属性 - 例如,ExplorerCommands
具有AboutAccurate
属性。属性getter反过来调用CommandBinder.GetCommandForCaller
,它似乎是Commands的工厂方法。它在管理器中查找预先存在的commad,如果不是,则调用CreateCommand
方法来创建命令。我相信资源与命令创建的关系不会有任何关系