0

我已经反编译了一个应用程序 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);

但我不知道命令类是如何创建的。它们的语法与资源类不同。有谁能够帮我?这是什么意思?以及如何实施这个案例?

哦..这是 exploreCommand 的基类:

代码:

[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; 
    }


}
4

1 回答 1

0

资源的示例是将在应用程序中使用的字符串(文本)、图像、图标等。与其将它们作为不同的文件分发,不如将它们嵌入到程序集(exe/dll)中并从那里引用。在 .NET 中,资源管理器是一个帮助类来引用这些资源。再一次,资源与特定类型(例如表单)相关联并称为本地资源。在 .NET 中,本地资源按它们关联的类型进行分类 - 本质上,资源名称将具有关联的类型名称前缀。资源管理器将类型作为参数,然后您可以通过简单的名称/键(在类型名称中是唯一的)引用相关资源。在你的情况下,<Name space>.ExplorerCommands.<resource name>)

因此,资源通常与代码逻辑无关——它们只是表示应用程序需要使用的一些常量文本或图像。

我不知道命令类是如何创建的。

从代码来看,派生自命令的类似乎CommandBinder暴露了属性——例如,ExplorerCommands具有AboutAccurate属性。属性 getter 反过来调用CommandBinder.GetCommandForCaller似乎是命令的工厂方法。它正在管理器中查找预先存在的命令,如果没有,它正在调用CreateCommand方法来创建命令。我相信就命令创建而言,资源不会有任何关系

于 2011-02-17T04:23:55.993 回答