Создайте посетителя для общего оператора в TransactSql.ScriptDom

TransactSql.ScriptDom позволяет просматривать объектную модель оператора SQL, расширяя класс TSqlFragmentVisitor. Для каждого типа оператора существует отдельный метод Visit, который можно переопределить. Но я хочу поместить один и тот же код в каждое посещение каждого типа. Мне нужно что-то вроде общего визита, для всех видов заявлений. Как я могу это сделать?

using Microsoft.SqlServer.TransactSql.ScriptDom;
using System.Reflection;
public class CustomVisitor: TSqlFragmentVisitor
{
    private void DoSomething(dynamic obj)
    {
        foreach (var property in obj.GetType().
            GetProperties(BindingFlags.Public | BindingFlags.Instance))
        {
            // Recursively analyse object model to find specific objects
        }
    }

    // Create table
    public override void Visit(CreateTableStatement node)
    {
        DoSomething(node);
        base.Visit(node);
    }

    // Create view
    public override void Visit(CreateViewStatement node)
    {
        DoSomething(node);
        base.Visit(node);
    }

    // ...
    // Huge number of Visit for different types of statement
}

1 ответ

Решение

Я нашел общий метод для всех видов утверждений: посещение (узел TSqlStatement). Код теперь выглядит так:

    using Microsoft.SqlServer.TransactSql.ScriptDom;
    using System.Reflection;
    public class CustomVisitor : TSqlFragmentVisitor
    {
        private void DoSomething(dynamic obj)
        {
            foreach (var property in obj.GetType().
                GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                // Recursively analyse object model to find specific objects
            }
        }

        // Generic statement
        public override void Visit(TSqlStatement node)
        {
            DoSomething(node);
            base.Visit(node);
        }
    }
// Generic statement
public override void Visit(TSqlStatement node)
{
    DoSomething(node);
    base.Visit(node);
}

}

Другие вопросы по тегам