Создайте посетителя для общего оператора в 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);
}
}