1

親クラス「command_functions」の複数のクラスがあります

class Empty_Command : command_functions

各コマンド クラスは値をオーバーライドします

public override string command_display_name { get { return "Empty"; } }

とにかく、command_display_nameが一致する文字列に設定されている場所を探して、command_functionsのタイプを検索し、それを返すことはありますか?

だから私はそれをそのように使うことができました

command_functions find = FindCommand("Empty");
if(find != null)
{
    new find();
}
4

4 に答える 4

2

Generics を使用すると、これを行うことができます。私が言えることは、クラス Empty_Command から継承する一連のクラスがあり (abstract を想定しています)、コマンド名に基づいて実行する特定のクラスを見つけたいということです。

継承されたすべての型が同じアセンブリにあると仮定する次の例を作成しました。それらが複数のアセンブリにまたがっていても、負荷が異なるだけで問題ありません。

public abstract class Empty_Command
{
    /// <summary>
    /// Find command
    /// </summary>
    /// <param name="commandName">the command name</param>
    /// <returns></returns>
    public static Empty_Command FindCommand(string commandName)
    {
        //get all the types that are inherited from the Empty_Command class and are not abstract (skips empty commad)
        var types = Assembly.GetExecutingAssembly().GetTypes().Where(x => typeof(Empty_Command).IsAssignableFrom(x) && !x.IsAbstract);
        //enuerate all types
        foreach (var type in types)
        {
            //create an instance of empty command from the type
            var item = Activator.CreateInstance(type) as Empty_Command;
            if (item == null)
                continue;
            //test the display name
            if(item.command_display_name.Equals(commandName))
                return item;
        }
        return null;
    }
    public abstract string command_display_name { get; }
}

役立つように、コードの一部にコメントを付けました。しかし、ここに私の完全なテストスタブがあります。

using System;
using System.Linq;
using System.Reflection;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var cmd = Empty_Command.FindCommand("command_2");
            if (cmd != null)
                Console.WriteLine(cmd.command_display_name);
            Console.ReadKey();


        }
    }

    public abstract class Empty_Command
    {
        /// <summary>
        /// Find command
        /// </summary>
        /// <param name="commandName">the command name</param>
        /// <returns></returns>
        public static Empty_Command FindCommand(string commandName)
        {
            //get all the types that are inherited from the Empty_Command class and are not abstract (skips empty commad)
            var types = Assembly.GetExecutingAssembly().GetTypes().Where(x => typeof(Empty_Command).IsAssignableFrom(x) && !x.IsAbstract);
            //enuerate all types
            foreach (var type in types)
            {
                //create an instance of empty command from the type
                var item = Activator.CreateInstance(type) as Empty_Command;
                if (item == null)
                    continue;
                //test the display name
                if(item.command_display_name.Equals(commandName))
                    return item;
            }
            return null;
        }
        public abstract string command_display_name { get; }
    }

    public class Command1 : Empty_Command
    {
        public override string command_display_name
        {
            get { return "command_1"; }
        }
    }

    public class Command2 : Empty_Command
    {
        public override string command_display_name
        {
            get { return "command_2"; }
        }
    }

    public class Command3 : Empty_Command
    {
        public override string command_display_name
        {
            get { return "command_3"; }
        }
    }
}

お役に立てれば...

于 2013-09-19T10:33:35.757 に答える
1

非静的プロパティの値を取得するには、型をインスタンス化する必要があります。したがって、最初の条件は、調べたい各型をインスタンス化できることです。

それ以外の場合は、リフレクションを使用して型のリストを取得し、基本型でフィルタリングし、インスタンス化してプロパティの get メソッドを呼び出すだけです。

于 2013-09-19T10:22:19.993 に答える
0

工場のデザインパターンを探しています。( http://en.wikipedia.org/wiki/Factory_method_pattern )

この Factory では、次のような関数を作成できます

command_functions findCommand(string commandText)
{
  if (commandText == "empty") return new Empty_Command();
  if (...) etc
}
于 2013-09-19T10:21:32.067 に答える