2016-10-30 3 views
0

Я искал что-то, что может скомпилировать метод, как если бы он был в другом классе, поэтому я могу внедрить метод, который использует внутренние поля и типы без необходимости вручную изменять Значения операндов.компиляция метода, как если бы он был частью другого класса

Например, если нам нужно, чтобы получить значение для отладки:

class bla{ 
internal string importantValue; 
... 
public void onInitialize(){ 
    ... 
    //this is where the compiler should be made to think it is 
} 
} 

и код, который идет в компилятор

public void onInitialize(){ //code to be compiled as if it were in that method 
    File.WriteAllText("usefulString.txt",importantValue.toString()); 
} 

и тогда мы можем получить иль скомпилированную продукцию и вставьте его в bla.onInitialize, чтобы мы могли получить наше значение

+0

использует 'partial' классы вариант? – Benj

+0

Вы спрашиваете, как взять произвольный бит кода и вставить его в отдельную предварительно скомпилированную сборку в качестве члена класса в этой сборке? – Abion47

+0

@ eim64 Я не понимаю, что вам нужно. Можете ли вы попытаться объяснить это? Если да, я уверен, что смогу вам помочь. Вам нужно сгенерировать метод, который может читать внутренние члены класса? –

ответ

0

С приведенным примером, сделав onInitialize() защищенным, n построение переопределения в другом классе будет работать.

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

+0

im ищет что-то, что может получить все методы и поля – eim64

+0

Вы хотите использовать метод тестирования под названием Fakes, который позволяет вам произвольно изменять код, исходя из того, что автор намеревался сделать и сделать что-то еще. Обычно это используется для изоляции кода, чтобы можно было провести единичное тестирование - см. Microsoft Fakes для получения дополнительной информации. – PhillipH

0

Я действительно не понимаю, чего вы хотите достичь, и я думаю, что есть более простой способ.

Но если я понимаю из названия вопроса, вы хотите скомпилировать свой класс bla (например), и вы хотите, чтобы в методе onInitialize был добавлен новый код (который не выходит из него) во время компиляции. Это правда?

Для этого у вас есть несколько способов. Я опишу два из них.

  1. Вы можете использовать библиотеку, такую ​​как StaticProxy.Fody. Этот lib позволяет вам перехватывать метод и вводить в него все, что вы хотите. Поэтому в вашем примере вы перехватываете метод onInitialize и добавляете к нему этот код File.WriteAllText("usefulString.txt",importantValue.toString()); Все это во время компиляции. После компиляции кода ваша dupup dll будет содержать этот введенный код.

  2. Второй вариант заключается в компиляции кода регулярно и после этого вы можете использовать Mono.Cecil читать скомпилированный DLL и написать код, который будет добавлять все, что вы хотите, где вы хотите, (в нашем примере, добавьте File.WriteAllText etc. к onInitialize) после того, как вы сохраните эту dll, она будет содержать новый код.

Оба варианта - это простой способ добавить код в статическом режиме (например, время компиляции, а не время выполнения).

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