获取对类的引用并仅从字符串值执行静态方法



如何使用字符串获得静态类的实例?

的例子:

类苹果:水果{public static Apple GetInstance(){…}private Apple() {}//其他}香蕉类:水果{公共静态香蕉GetInstance(){…}private Banana() {}//其他}//在代码的其他地方…string fruitIWant = "苹果";IFruit myFruitInstance =[这里用fruitIWant做什么?].GetInstance();
Type appleType = Type.GetType("Apple");
MethodInfo methodInfo = appleType.GetMethod(
                            "GetInstance",
                            BindingFlags.Public | BindingFlags.Static
                        );
object appleInstance = methodInfo.Invoke(null, null);

注意,在Type.GetType中,您需要使用程序集限定名

下面是一个完整的示例。只需传入要加载的类型的名称和要调用的方法的名称:

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

你这样做:

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

对于ApplicationName,您可以替换声明类的名称空间。

(测试和工作)

好的,也许我明白你的问题了。伪代码

编辑

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

应该. .

当其他人给你你想要的,这可能是你想要的:

IFriut GetFruit(string fruitName)
{
   switch(fruitName)
   {
       case "Apple":
          return Apple.GetInstance();
       case "Banana":
          return Banana.GetInstance();
       default:
          throw new ArgumentOutOfRangeException();
   }
}

最新更新