Я пишу пользовательское правило StyleCop, чтобы предотвратить присвоение String
переменных null
, и столкнулся с проблемой!
Я могу легко предотвратить присвоение переменной String
null
во время объявления с помощью следующего кода:
if (expression.ExpressionType == ExpressionType.VariableDeclarator)
{
VariableDeclaratorExpression variableDeclarator = ((VariableDeclaratorExpression)expression);
if (variableDeclarator.Initializer == null)
{
if ((parentStatement.StatementType != StatementType.Catch) &&
(parentStatement.StatementType != StatementType.Foreach))
{
this.AddViolation(parentElement, expression.LineNumber, "InitialiseVariablesOnDeclaration");
}
}
else
{
Boolean isString = false;
foreach (CsToken token in variableDeclarator.ParentVariable.Tokens)
{
if ((token.Text.Equals("String")) || (token.Text.Equals("string")))
{
isString = true;
break;
}
}
if (isString)
{
foreach (CsToken token in variableDeclarator.Initializer.Tokens)
{
if (token.CsTokenType == CsTokenType.Null)
{
this.AddViolation(parentElement, expression.LineNumber, "DoNotAssignStringsToNull");
break;
}
}
}
}
}
(Обратите внимание, что этот код также проверяет, что переменные присваиваются явно при их объявлении).
У меня возникли проблемы с проверкой String
переменных, которым присваивается null
после их объявления. API StyleCop, похоже, не предоставляет никакого механизма для поиска типа переменной в левой части оператора присваивания.
Следовательно, этот код запускает правило, которое у меня есть только что:
String someString = null;
Но этот код не:
String someOtherString = String.Empty;
someOtherString = null;
В настоящее время я использую StyleCop версии 4.7.19.0. Любые указатели в правильном направлении будут с благодарностью получены!