2009-07-13 6 views

ответ

26

Вы хотите использовать reflection.

Вот простой пример:

using System; 
using System.Reflection; 

class Program 
{ 
    static void Main() 
    { 
     caller("Foo", "Bar"); 
    } 

    static void caller(String myclass, String mymethod) 
    { 
     // Get a type from the string 
     Type type = Type.GetType(myclass); 
     // Create an instance of that type 
     Object obj = Activator.CreateInstance(type); 
     // Retrieve the method you are looking for 
     MethodInfo methodInfo = type.GetMethod(mymethod); 
     // Invoke the method on the instance we created above 
     methodInfo.Invoke(obj, null); 
    } 
} 

class Foo 
{ 
    public void Bar() 
    { 
     Console.WriteLine("Bar"); 
    } 
} 

Теперь это очень простой пример, лишенный контроля ошибок, а также игнорирует большие проблемы, как то, что делать, если тип живет в другой сборке, но я думаю, это должно привести вас к правильному пути.

+0

До тех пор, пока сборка загружена, а имя типа соответствует требованиям сборки, вы золотые. –

+0

Хм ... Я ', нахожу, что ваш пример возвращает null в «Type.GetType (myclass);» – pistacchio

+1

Это потому, что сборка, содержащая myclass, еще не загружена в appdomain. Вам нужно будет получить имя сборки от вызывающего и сделать Assembly.LoadFrom или один из многих вариантов для загрузки сборки в первую очередь. – Will

8

Что-то вроде этого:

public object InvokeByName(string typeName, string methodName) 
{ 
    Type callType = Type.GetType(typeName); 

    return callType.InvokeMember(methodName, 
        BindingFlags.InvokeMethod | BindingFlags.Public, 
        null, null, null); 
} 

Вы должны изменить обязательные флаги в соответствии с методом, который вы хотите позвонить, а также проверить метод Type.InvokeMember в MSDN, чтобы быть уверенным, что вам действительно нужно.

+0

-1 Это не компилируется. –

+1

Вы правы, мои извинения. Отредактировано для добавления аргументов метода, которые нельзя опустить (C# 4.0, где вы) :) –

-3

Какова ваша причина для этого? Скорее всего, вы можете сделать это без отражения, вплоть до динамической загрузки сборки.