2015-05-17 4 views
1

Я пытаюсь вызвать метод из динамического, не зная его имени. У меня есть трудности, чтобы объяснить это на английском, так что есть код:Вызов динамического метода из строки

public void CallMethod(dynamic d, string n) 
{ 
    // Here I want to call the method named n in the dynamic d 
} 

Я хочу что-то вроде: d.n() но с п заменить строкой.

Я хочу это:

Type thisType = this.GetType(); 
MethodInfo theMethod = thisType.GetMethod(TheCommandString); 
theMethod.Invoke(this, userParameters); 

но с динамической.

Если вам нужен контекст, который поможет вам: я создаю приложение, поддерживающее «моды», вы помещаете библиотеки DLL в папку мод и загружаете его и выполняете. Он работает с динамиком (у меня есть такая дрессировка: Dictionnary<string, dynamic> instances;). Я хочу, чтобы приложение получало имя метода из библиотеки (с instances["topkek"].GetMethods();, я уже сделал этот метод), но затем вызовите метод с возвращаемой им строкой. Я не знаю, что то, что я сказал, что-то значит (я французский: /) ...

Я использую VS 2013 Express с .Net framework 4.5, если вам нужна дополнительная информация, чтобы помочь мне спросить меня ,

+0

Как вы будете знать, какой метод вызвать? Вы можете использовать ['Type.GetMethods'] (http://msdn.microsoft.com/en-us/library/system.type.getmethods) на« нормальном »типе - не знаете, как он будет работать с 'dynamic'. –

+0

Ваш вопрос слишком широк и дает очень мало деталей. Попробуйте приложить некоторые усилия и объясните сами. –

+0

Метод указан пользователем, мне нужно что-то вроде: «d.n()», ofc, если метод не существует, он сработает. Так что это невозможно с динамикой? – SwagLordKnight

ответ

2

Вы можете написать свой метод следующим образом -

public void CallMethod(dynamic d, string n) 
    { 
     d.GetType().GetMethod(n).Invoke(d, null); 
    } 
1

Если все методы недействительны, это может сработать. В противном случае вам нужно немного изменить его.

public void CallMethod(string className, string methodName) 
    { 
     object dynamicObject; 
     // Here I want to call the method named n in the dynamic d 
     string objectClass = "yourNamespace.yourFolder." + className; 
     Type objectType = Type.GetType(objectClass); 
     if (objectType == null) 
     { 
      // Handle here unknown dynamic objects 
     } 
     else 
     { 
      // Call here the desired method 
      dynamicObject = Activator.CreateInstance(objectType); 
      System.Reflection.MethodInfo method = objectType.GetMethod(methodName); 
      if (method == null) 
      { 
       // Handle here unknown method for the known dynamic object 
      } 
      else 
      { 
       object[] parameters = new object[] { }; // No parameters 
       method.Invoke(dynamicObject, parameters); 
      } 
     } 
    } 
+0

Спасибо, но я не хочу создавать новый экземпляр моего типа, экземпляр уже является переменной «d». – SwagLordKnight

+0

@SwagLordKnight Тогда это еще проще, вы можете пропустить часть, чтобы построить objectClass. Проверьте [link] (https://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.tryinvokemember (v = vs.110) .aspx) –

+1

не могли бы вы назвать ваши параметры более наглядным образом ? –