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ます。プロパティ ゲッターは、CommandBinder.GetCommandForCallerコマンドのファクトリ メソッドのように見える呼び出しを行います。マネージャーで既存のコマンドを検索しており、そうでない場合はCreateCommand、コマンドを作成するメソッドを呼び出しています。コマンドの作成に関しては、リソースは関係ないと思います

于 2011-02-17T04:23:55.993 に答える