2013-09-25 1 views
1

У меня есть веб-сервис в определенном пространстве имен, назовем его MyNamespace. Это обычный веб-сервис с web-методами в коде. У меня также есть дополнительный файл .cs со всеми типами классов, используемых в этих веб-методах. Пока все хорошо, правда?Доступ к внутренним классам и методам в веб-сервисе без кода за пределами

Тогда у меня есть дополнительный веб-сервис, используемый только для тестирования. У него нет кода, и его код находится непосредственно в файле .asmx, поэтому я могу быстро загрузить его на сервер, не перестраивая ничего. Этот тестовый веб-сервис находится в том же пространстве имен MyNamespace, что и веб-сервис, упомянутый в первом абзаце и в том же проекте. Он отлично работает и все, пока я не попытаюсь получить доступ к внутренним членам MyNamespace. Это невозможно сделать, они невидимы, как если бы они были частными.

Это то место, где я могу начать писать вздор, поэтому, пожалуйста, исправьте меня, если это необходимо. Я немного огляделся, и кажется, что это «предназначено», потому что .asmx без надлежащего кода позади компилируется во время выполнения и не является частью надлежащей сборки. Поскольку внутренние члены доступны только в сборке, совершенно правильно, что они не доступны в моем .asmx-коде. Тогда мой вопрос: могу ли я получить доступ к этим членам каким-то образом, не переведя свой код в код .asmx.cs за файлом?

ответ

1

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

Например: Для вызова внутреннего метода на общественном классе:

var myPublicClass = new PublicClass; 
MethodInfo mInfo = typeof(PublicClass).GetMethod("InternalMethodName", BindingFlags.Instance | BindingFlags.NonPublic); 

var result = mInfo.Invoke(myPublicCLass, null) // (replace null with an array of parameters if necessary) 

Или создать в экземпляр внутреннего класса:

MethodInfo mInfo= Type.GetType(assemblyQualifiedName).GetConstructor(
         BindingFlags.NonPublic | BindingFlags.Instance, 
         null, 
         new[] { typeof(string) }, 
         null 
        ); 
object myInstance = mInfo.Invoke(new[] { "constructorArgument" }); 

Edit: Внутренний статический метод внутреннего статического класса :

MethodInfo mInfo = Type.GetType(assemblyQualifiedName).GetMethod("InternalMethodName", BindingFlags.Static| BindingFlags.NonPublic); 

var result = mInfo.Invoke(null, null) // (replace 2nd null with an array of parameters if necessary) 
+0

Право, отражение, полностью забыл об этом, спасибо. Не совсем то, что я имел в виду, поскольку это не самый быстрый метод, но его более чем достаточно для тестирования. Разум помогает мне с примером внутреннего статического метода из внутреннего статического класса? :) –

+0

Привет, добавил пример этого. Надеюсь, это сработает! –