2016-01-14 7 views
4

Я просматриваю исходный код внутреннего .Net-класса и хочу изменить функцию с помощью отражения. (Переписывая каждую строку исходной функции в новую функцию с помощью отражения и добавить свою модификацию в нее)Как передать объект во внутренний класс

object responseObject = request.ConnectionAsyncResult.InternalWaitForCompletion(); 
ConnectStream writeStream = responseObject as ConnectStream; 
if (writeStream == null) ... 

Как я должен написать вторую строку кода?

Код проверяет, является ли объект конкретным классом, но я понятия не имею, как это сделать, если класс является внутренним классом. Как передать объект во внутренний класс?

ConnectStream является внутренний класс

+0

* «изменить функцию» * - как вы собираетесь это делать? Я не думаю, что у C# есть возможности метапрограммирования. Я там не прав? – Domysee

+0

Я переписываю каждую строку исходной функции с помощью отражения и добавляю в нее свою модификацию –

+1

Как вы переписываете методы? – thehennyy

ответ

3

Ну, вы не знаете. Вам просто нужно использовать рефлексию для каждого шага - компилятор наверняка вам не поможет :)

«Переписывание каждой отдельной строки» - это плохая идея в любом случае - немного сложнее получить код, который на самом деле работает. Вместо этого вы, вероятно, просто хотите, чтобы ваш вспомогательный метод вызывал оригинальный метод, а также делал все, что вам нужно.

При использовании отражения вам не нужно знать типы во время компиляции, и вам не нужно соблюдать все правила C#. Код, который примерно соответствует вашему оригиналу может выглядеть следующим образом:

if (responseObject != null && responseObject.GetType().Name == "ConnectStream") 

В зависимости от реальных потребностей, есть более эффективные способы, чтобы сделать этот чек, а также - к примеру, можно взять System.Net сборку и найти ConnectStream с правильным пространством имен и всем, и сравнить два экземпляра Type напрямую. Но в коде вроде этого это не обязательно.

+0

Мне нужно добавить модификацию среди метода, поэтому я не могу вызвать оригинальный метод. Я знаю, что мне нужно использовать рефлексию для каждого шага, и я спрашиваю, как написать вторую строку кода. Извините, если мой вопрос непонятен –

+0

@IsoletChan Вот что я вам говорю - вы этого не делаете. Вам нужно будет использовать API Reflection, чтобы вызывать все, что вам нужно, и выполнять любые проверки типов. Буквально, 'responseObject.GetType(). GetMethod (...). Invoke (...);'. Это очень * утомительно, но это цена, которую вы платите за нарушение инвариантов :) – Luaan

+0

Да, я использую отражение api и записываю этот утомительный код. Как бы вы написали вторую строку кода? –

Смежные вопросы