Я пытаюсь написать анализатор кода, который будет проверять, есть ли какие-нибудь IDataReaders, которые не закрыты.
Я рассмотрел этот вопрос , но он не объясняет, как это может готово, я также попытался прочитать документацию по ссылке github Используемый здесь язык Engli sh слишком сложен, и я не понял, как я смогу найти все экземпляры типа IDataReader и убедитесь, что на нем вызывается метод close () до того, как какая-либо переменная указанного типа выйдет из области видимости.
Я попытался создать проект типа Analyzer с исправлением кода в Visual Studio, я попытался зарегистрируйте контекст операции в методе Initialize моего класса (который расширен от типа DiagnosticAnalyzer
следующим образом:
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public class DataReaderAnalyzerAnalyzer : DiagnosticAnalyzer
{
public const string DiagnosticId = "DataReaderAnalyzer";
private static readonly LocalizableString Title = new LocalizableResourceString(nameof(Resources.AnalyzerTitle), Resources.ResourceManager, typeof(Resources));
private static readonly LocalizableString MessageFormat = new LocalizableResourceString(nameof(Resources.AnalyzerMessageFormat), Resources.ResourceManager, typeof(Resources));
private static readonly LocalizableString Description = new LocalizableResourceString(nameof(Resources.AnalyzerDescription), Resources.ResourceManager, typeof(Resources));
private const string Category = "DBConnectionCheck";
private static DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Error, isEnabledByDefault: true, description: Description);
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } }
public override void Initialize(AnalysisContext context)
{
context.RegisterOperationAction((operationContext) =>
{
((Microsoft.CodeAnalysis.CSharp.Syntax.AssignmentExpressionSyntax)((Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionStatementSyntax)operationContext.Operation.Syntax).Expression).Left
}
, OperationKind.ExpressionStatement);
}
}
Я хочу найти все ссылки на вхождение переменной, содержащей тип IDataReader, убедитесь, что в этой переменной вызывается метод close, прежде чем она будет потеряна за пределами области видимости.
Пример моего кода, который я хотел бы проанализировать, выглядит следующим образом.
class Program
{
static void Main(string[] args)
{
IDataReader reader = null;
try
{
Database db = DatabaseFactory.CreateDatabase("ApplicationConnection");
reader = GetDataReader(db);
while (reader.Read())
{
//Do somethig with the data here
}
reader.Close();
}
catch (Exception)
{
throw;
}
finally
{
if (reader != null && !reader.IsClosed)
{
reader.Close();
}
}
}
public static IDataReader GetDataReader(Database db)
{
DbCommand dbcmd = db.GetSqlStringCommand("some select statement to get data from oracle data base");
var reader = db.ExecuteReader(dbcmd);
return reader;
}
}