C# 在Transact-SQL.ScriptDom中为泛型语句创建访问者
使用Transact-SQL.ScriptDom,可以通过扩展TSqlFragmentVisitor类来查看SQL语句的对象模型。对于每种语句类型,都有一个可以重写的单独访问方法。但我希望在每次访问中,每种类型的访问都使用完全相同的代码。我需要一些类似于普通访问的东西,用于各种声明。我该怎么做C# 在Transact-SQL.ScriptDom中为泛型语句创建访问者,c#,sql-server,scriptdom,C#,Sql Server,Scriptdom,使用Transact-SQL.ScriptDom,可以通过扩展TSqlFragmentVisitor类来查看SQL语句的对象模型。对于每种语句类型,都有一个可以重写的单独访问方法。但我希望在每次访问中,每种类型的访问都使用完全相同的代码。我需要一些类似于普通访问的东西,用于各种声明。我该怎么做 using Microsoft.SqlServer.TransactSql.ScriptDom; using System.Reflection; public class CustomVisitor:
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
}
我确实为所有类型的语句找到了一个通用方法:Visit(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);
}
}void-Visit(tsqlfragmentnode)
更为通用,也是base.Visit(node)
不是必需的,因为TSqlFragmentVisitor
中的抽象类实现总是空的