2009-09-13 2 views
16

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

Например:

Учитывая System.Environment и GetFolderPath, я хотел бы использовать Reflection позвонить Environment.GetFolderPath().

ответ

32

Просто

Type.GetType(typeName).GetMethod(methodName).Invoke(null, arguments); 

где typeName это имя типа в виде строки, methodName этого имя метода в виде строки, и arguments представляет собой массив объектов, содержащих аргументы для вызова метода с ,

+0

Wow, хорошо, да, что работает - не знал о Type.GetType - просто убедитесь, что имя класса Static полностью соответствует пространству имен –

+0

Работает на *** 'внутренний статический класс' ***? – Kiquenet

+0

@GeorgeMauer, а если нет пространства имен? – MonsterMMORPG

1

Вот основной набросок того, что вы могли бы сделать:

  1. Проверять все объекты в текущем домене приложения - найти тот, который соответствует тому, что вы знаете имя класса, чтобы быть
  2. Получить статический метод с именем, которое вы знаете об этом объекте
  3. Динамически вызывать его.

Edit: Это будет работать, если вы не знаете имен статического класса. В противном случае решение Daniel Brückner будет намного проще.

+0

Я думаю, что вы все еще нужно сканировать AppDomain - Если бы вы могли просто создать экземпляр класса это будет динамический язык –

+1

Type.GetType? http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx – dtb

+2

Это может быть буквальное описание того, что происходит во время процесса отражения, однако я не думаю, что этот ответ полезен для OP, потому что он практически не демонстрирует или не объясняет, как шаги, которые вы наметили, можно использовать с помощью.net framework APIs – Crippledsmurf

1
System.Reflection.Assembly info = typeof(System.Environment).Assembly; 

Type t = info.GetType("System.Environment"); 
MethodInfo m = t.GetMethod("GetFolderPath"); 

object result = m.Invoke(null, arguments); 
3

Сначала вы должны получить тип (итерации по сборке с помощью отражения)

см этой ссылки для подробностей: http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.aspx

или использовать

Assembly.GetType 

как только вы тип в руке, вы можете перебирать элементы с использованием отражения или

MethodInfo method = typeof(MyClass).GetMethod("MyMethod"); 

, то вы можете использовать MethodInfo.Invoke и передать аргументы для вызова метода, когда вы хотите его вызывать.

+0

** MyClass ** является общедоступным, а не для *** 'внутреннего статического класса' ***? – Kiquenet

1

Что вы делаете здесь отражающее от типа имени Environment и используя GetPropery и GetGetMethod методы, чтобы получить метод GET в Environment.CurrentDirectory собственности, как это;

var getMethod = typeof(Environment).GetProperty("CurentDirectory", BindingFlags.Public | BindingFlags.Static).GetGetMethod(); 
var currentDirectory = (string)getMethod.Invoke(null, null); 

Вызов метода get свойства возвращает его значение и эквивалентен;

var value = Environment.CurrentDirectory;