Re[9]: Поиск методов, удовлетворяющих условию
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.06.10 16:45
Оценка: -1
Здравствуйте, Lloyd, Вы писали:

G>>А твой пример не расширяется до поиска любого обращения.


L>Почему не расширяется? Допиши нужную логику в HasStaticFieldWrite и всех делов-то.

Ну допиши

L>Кстати, ты попустил вопрос:

L>

L>Да и как этот ответ связан с использованием визитора?

Как допишешь — так узнаешь
Re[10]: Поиск методов, удовлетворяющих условию
От: Lloyd Россия  
Дата: 23.06.10 19:12
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>>>А твой пример не расширяется до поиска любого обращения.


L>>Почему не расширяется? Допиши нужную логику в HasStaticFieldWrite и всех делов-то.

G> Ну допиши

Ну допишу. Ты в это время свой вариант не забудь подготовить.

L>>Кстати, ты попустил вопрос:

L>>

L>>Да и как этот ответ связан с использованием визитора?

G>Как допишешь — так узнаешь

Да уж сообщи мне, если знаешь. Вдруг ты действительно прав.
Re[11]: Поиск методов, удовлетворяющих условию
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.06.10 08:54
Оценка: +1
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, gandjustas, Вы писали:


G>>>>А твой пример не расширяется до поиска любого обращения.


L>>>Почему не расширяется? Допиши нужную логику в HasStaticFieldWrite и всех делов-то.

G>> Ну допиши

L>Ну допишу. Ты в это время свой вариант не забудь подготовить.


public class FindStaticReferencesVisitor: BaseCodeTraverser
{
    public static bool HasStaticReferences(IMethodDefinition method)
    {
        var visitor = new FindStaticReferencesVisitor();
        visitor.Visit(method);
        return visitor.staticReferences.Any();

    }
    List<ITypeDefinitionMember> staticReferences = new List<ITypeDefinitionMember>();

    public override void Visit(ITargetExpression targetExpression)
    {
        CollectStaticReferences(targetExpression.Definition);
        base.Visit(targetExpression);
    }

    public override void Visit(IBoundExpression boundExpression)
    {
        CollectStaticReferences(boundExpression.Definition);
        base.Visit(boundExpression);
    }

    private void CollectStaticReferences(object definition)
    {
        if (definition is IFieldDefinition)
        {
            var fieldDef = definition as IFieldDefinition;
            if (fieldDef.IsStatic)
            {
                staticReferences.Add(fieldDef);
            }
        }

        if (definition is IPropertyDefinition)
        {
            var propertyDef = definition as IPropertyDefinition;
            if (propertyDef.Accessors.Select(a => a.ResolvedMethod).All(m => m.IsStatic))
            {
                staticReferences.Add(propertyDef);
            }
        }
    }
}

class Program
{
    static string assemblyName;

    static void Main(string[] args)
    {
        assemblyName = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;

        var host = new CodeContractAwareHostEnvironment();

        IAssembly assembly = host.LoadUnitFrom(assemblyName) as IAssembly;
        if (assembly == null || assembly == Dummy.Assembly)
        {
            Console.WriteLine("Error");
        }
        else
        {
            var codeAssembly = Decompiler.GetCodeModelFromMetadataModel(host, assembly, null);
            var q = from t in codeAssembly.AllTypes
                    from m in t.Methods
                    where FindStaticReferencesVisitor.HasStaticReferences(m)
                    select m;
            var method = q.First();
            Console.WriteLine(method.Name);
            
        }

    }
}


Вот как-то так.
Re[12]: Поиск методов, удовлетворяющих условию
От: Lloyd Россия  
Дата: 24.06.10 09:48
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Вот как-то так.


Да, действительно, самому читать — чрезчур много писанины получается.
Re[13]: Поиск методов, удовлетворяющих условию
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.06.10 11:11
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, gandjustas, Вы писали:


G>>Вот как-то так.


L>Да, действительно, самому читать — чрезчур много писанины получается.


Это "чрезчур много писанины" называется визитором.

Вот и ответ на твой вопрос.
Re[14]: Поиск методов, удовлетворяющих условию
От: Lloyd Россия  
Дата: 24.06.10 11:16
Оценка:
Здравствуйте, gandjustas, Вы писали:

L>>Да, действительно, самому читать — чрезчур много писанины получается.


G>Это "чрезчур много писанины" называется визитором.


G>Вот и ответ на твой вопрос.


Нет, визитор тут не причем.
Re[15]: Поиск методов, удовлетворяющих условию
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.06.10 11:21
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, gandjustas, Вы писали:


L>>>Да, действительно, самому читать — чрезчур много писанины получается.


G>>Это "чрезчур много писанины" называется визитором.


G>>Вот и ответ на твой вопрос.


L>Нет, визитор тут не причем.



Может все таки напишешь а там посмотрим?
Re[16]: Поиск методов, удовлетворяющих условию
От: Lloyd Россия  
Дата: 24.06.10 11:25
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>>>Это "чрезчур много писанины" называется визитором.


G>>>Вот и ответ на твой вопрос.


L>>Нет, визитор тут не причем.


G>

G>Может все таки напишешь а там посмотрим?

Я уже написал, что в моем варианте писанины будет много. У тебя получилось компактнее. Но это не далает мое решение "визитором".
Re[17]: Поиск методов, удовлетворяющих условию
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.06.10 11:37
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, gandjustas, Вы писали:


G>>>>Это "чрезчур много писанины" называется визитором.


G>>>>Вот и ответ на твой вопрос.


L>>>Нет, визитор тут не причем.


G>>

G>>Может все таки напишешь а там посмотрим?

L>Я уже написал, что в моем варианте писанины будет много. У тебя получилось компактнее. Но это не далает мое решение "визитором".


Ок, напиши свое решение и посмотрим.
Re[18]: Поиск методов, удовлетворяющих условию
От: Lloyd Россия  
Дата: 24.06.10 11:47
Оценка:
Здравствуйте, gandjustas, Вы писали:

L>>>>Нет, визитор тут не причем.


G>>>

G>>>Может все таки напишешь а там посмотрим?

L>>Я уже написал, что в моем варианте писанины будет много. У тебя получилось компактнее. Но это не далает мое решение "визитором".


G>Ок, напиши свое решение и посмотрим.


Ты читаешь сообщения, на которые отвечаешь? Я же написал, что писанины много и писать его я не хочу.
Re[19]: Поиск методов, удовлетворяющих условию
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.06.10 12:20
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, gandjustas, Вы писали:


L>>>>>Нет, визитор тут не причем.


G>>>>

G>>>>Может все таки напишешь а там посмотрим?

L>>>Я уже написал, что в моем варианте писанины будет много. У тебя получилось компактнее. Но это не далает мое решение "визитором".


G>>Ок, напиши свое решение и посмотрим.


L>Ты читаешь сообщения, на которые отвечаешь? Я же написал, что писанины много и писать его я не хочу.


Ну тогда ты не можешь сказать какого вида получится конструкция.
А я такие конструкции писал, и уверен что у тебя будет визитор.
Re[20]: Поиск методов, удовлетворяющих условию
От: Lloyd Россия  
Дата: 24.06.10 12:37
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>>>Ок, напиши свое решение и посмотрим.


L>>Ты читаешь сообщения, на которые отвечаешь? Я же написал, что писанины много и писать его я не хочу.


G>Ну тогда ты не можешь сказать какого вида получится конструкция.

G>А я такие конструкции писал, и уверен что у тебя будет визитор.

Будет банальный FlattenTree, уплощающий дерево в плоский список. Это типа SelectMany, но который идет не на один уровень, а вглубь.
Re[21]: Поиск методов, удовлетворяющих условию
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.06.10 12:44
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, gandjustas, Вы писали:


G>>>>Ок, напиши свое решение и посмотрим.


L>>>Ты читаешь сообщения, на которые отвечаешь? Я же написал, что писанины много и писать его я не хочу.


G>>Ну тогда ты не можешь сказать какого вида получится конструкция.

G>>А я такие конструкции писал, и уверен что у тебя будет визитор.

L>Будет банальный FlattenTree, уплощающий дерево в плоский список. Это типа SelectMany, но который идет не на один уровень, а вглубь.


А если в этом "банальном FlattenTree" изолировать сам обход от алгоритма обработки, чтобы обход дерева можно было переиспользовать, то получится визитор.
Re[22]: Поиск методов, удовлетворяющих условию
От: Lloyd Россия  
Дата: 24.06.10 12:51
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

L>>Будет банальный FlattenTree, уплощающий дерево в плоский список. Это типа SelectMany, но который идет не на один уровень, а вглубь.


G>А если в этом "банальном FlattenTree" изолировать сам обход от алгоритма обработки, чтобы обход дерева можно было переиспользовать, то получится визитор.


Не получится: алгоритм обхода и так изолирован в FlattenTree.
Единственное преимущество visitor-а — это то, что он сам будет выбирать нужный метод обработки, но в этом случае, имхо, удобнее вынести алгоритм диспетчеризации в отдельный класс. Так что никаких преимуществ у визитора в данном случае не просматривается.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.