Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Инормация о переменных, объявленных в методе.


Автор: desevg 26.7.2009, 15:54
к примеру есть код сбоки:

Код

using System;
using System.Collections.Generic;
using System.Text;
namespace UserAssembly
{
    class Program
    {
        static void Main(string[] args) {}
    }
    public class Code {
       public string doUserCode() { 
         int a = 10;
         string s = "asd";  
         return s;
      }
    }
}


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


Автор: kobra 26.7.2009, 17:54
если сделать их публичними, да

Автор: desevg 26.7.2009, 18:08
публичными? оО это же не свойства класса, а просто локальные переменные метода. вопрос открыт! если что я не понимаю, приведите пример, пожалуйста

Автор: Экскалупатор 26.7.2009, 19:15
desevg, программно я думаю не сможете(имхо, я не волшебник я только учусь) т.е. во время выполнения вашего кода, а вот чем_нибудь сторонним дизасемблировать я думаю можно. ILDasm вроде умеет, если конечно переменные не были переименованы во время компиляции.

Автор: mihryak 26.7.2009, 19:44
http://msdn.microsoft.com/en-us/library/system.reflection.localvariableinfo.aspx

Автор: desevg 26.7.2009, 20:52
Экскалупатор, нет. нужно программно.

mihryak, неплохой класс. но как я понял, он даст только представление о типах переменных и их количестве. я попробую еще порыть там, но мне нужно вытащить имена переменных, которые там содержатся. если кто знает, помогитеsmile

Да, как я и предположил на скидку, он выдает тип и индекс переменной в стеке, а мне по зарез нужны имена.

определю задачу. мне нужно сделать следующее.

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

как вариант, можно, конечно, распарсить код набранный пользователем, но хочется изящного решения;)

нашел класс FieldInfo, но он для класса. Там можно для класса получить поля:

Код

FieldInfo[] fi;
Type f = typeof(yourClass);
t = f.GetFields(...);

t[index].Name - получаешь имя поля



не уж то нет для локальных такого?:(

Автор: mihryak 26.7.2009, 22:49
хотя при вызове TypeBuilder.DefineField и требуется указать имя переменной, интернет-сообщество сходится во мнении, что получить их обратно через рефлексию уже не удастся
судя по всему, придётся разбирать IL, искомое будет находиться в  директиве .locals

пс. тебе не поможет, но всё равно занятная статейка нагуглилась - http://abdullin.com/journal/2008/12/13/how-to-find-out-variable-or-parameter-name-in-c.html

Автор: desevg 27.7.2009, 15:19
интересная статья, правда немного сложно для меня. я в шарпе без году неделя... что-то ничего так и несмог пока найти, как получить. ты говоришь, что нужно разбирать IL, а можешь по подробней написать? в какую сторону рыть?

Автор: mihryak 27.7.2009, 18:22
не, не могу, увы, сам "не в теме"
никогда этим не занимался, а разбираться долго и сложно

посмотри на http://sourceforge.net/projects/reflexil/

Автор: Экскалупатор 27.7.2009, 22:32
desevg, сдается мне, что проще будет распарсить то что введет пользователь, чем разбирать IL

Автор: mihryak 28.7.2009, 08:34
Цитата(Экскалупатор @  27.7.2009,  23:32 Найти цитируемый пост)
desevg, сдается мне, что проще будет распарсить то что введет пользователь, чем разбирать IL 

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

а вообще - имеет ли вообще задача решение?
например, локальные переменные объявлены в цикле, из значение в конце цикла неопределено, да и вообще не несёт никакого цикла
а при использовании анонимных делегатов-лямбд вообще будут сгенерированы дополнительные классы. что делать с ними?

Автор: desevg 28.7.2009, 13:09
Цитата(mihryak @  28.7.2009,  08:34 Найти цитируемый пост)
а при использовании анонимных делегатов-лямбд вообще будут сгенерированы дополнительные классы. что делать с ними? 


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

алгоритмы в один метод, как правило. Ученик будет рисовать блок схему и по ней будет собираться код. потом подставляться в код подготовленного метода и если выбран режим компиляции, то создается ехе файл, а если отладки, для этого и нужен вышеописанный гем**ой. нужно проанализировать переменные, которые есть и подставить свой код, который после исполнения метода вернет данные по переменным для анализа.

Добавлено @ 13:14
т.е.

Код

Подготовленный класс {
  метод {
      /*
               код школьника
      */
     /*
        код, анализирующий и возвращающий переменные.
    */
  }
}


соответственно, вызывать это чудо можно рефлексией

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)