Получить ссылку на класс и выполнить статический метод только из строкового значения? - PullRequest
3 голосов
/ 25 августа 2011

Как я могу получить экземпляр статического класса со строкой?

Пример:

class Apple : IFruit
{
    public static Apple GetInstance() { ... }
    private Apple() { }

    // other stuff
}

class Banana : IFruit
{
    public static Banana GetInstance() { ... }
    private Banana() { }

    // other stuff
}

// Elsewhere in the code...
string fruitIWant = "Apple";
IFruit myFruitInstance = [What goes here using "fruitIWant"?].GetInstance();

Ответы [ 5 ]

2 голосов
/ 26 августа 2011

Вот полный пример. Просто передайте имя типа, который вы хотите загрузить, и имя вызываемого метода:

namespace Test
{

    class Program
    {
        const string format = @"hh\:mm\:ss\,fff";
        static void Main(string[] args)
        {
            Console.WriteLine(Invoke("Test.Apple", "GetInstance"));
            Console.WriteLine(Invoke("Test.Banana", "GetInstance"));
        }
        public static object Invoke(string type, string method)
        {
            Type t = Type.GetType(type);
            object o = t.InvokeMember(method, BindingFlags.InvokeMethod, null, t, new object[0]);
            return o;
        }

        }
        class Apple 
        {
            public static Apple GetInstance() { return new Apple(); }
            private Apple() { }

            // other stuff
        }

        class Banana
        {
            public static Banana GetInstance() { return new Banana(); }
            private Banana() { }

            // other stuff
        }

}
2 голосов
/ 26 августа 2011
Type appleType = Type.GetType("Apple");
MethodInfo methodInfo = appleType.GetMethod(
                            "GetInstance",
                            BindingFlags.Public | BindingFlags.Static
                        );
object appleInstance = methodInfo.Invoke(null, null);

Обратите внимание, что в Type.GetType необходимо использовать имя с указанием сборки .

0 голосов
/ 26 августа 2011

В то время как другие дают вам то, о чем вы просили, это, вероятно, то, что вы хотите:

IFriut GetFruit(string fruitName)
{
   switch(fruitName)
   {
       case "Apple":
          return Apple.GetInstance();
       case "Banana":
          return Banana.GetInstance();
       default:
          throw new ArgumentOutOfRangeException();
   }
}
0 голосов
/ 26 августа 2011

Вам так нравится:

string fruitIWant = "ApplicationName.Apple";

IFruit a = Type.GetType(fruitIWant).GetMethod("GetInstance").Invoke(null, null) as IFruit;

Для ApplicationName вы заменяете пространство имен, в котором объявлен класс.

(Проверено и работает.)

0 голосов
/ 25 августа 2011

ОК, возможно, я получил ваш вопрос. A псевдокод

EDIT

foreach (var type in System.Reflection.Assembly.GetExecutingAssembly().GetTypes())
{
      if (type.Name.Equals("MyClass"))
      {
          MethodInfo mi = type.GetMethod("GetInstance", BindingFlags.Static);
          object o = mi.Invoke(t, null);
          break;
      }
}

Должно работать ..

...