Почему я получаю ошибку ReSharper "Извлеченный код имеет несколько точек входа"?
Я использую ReSharper для переопределения кода. Когда я пытаюсь переместить блок кода в метод, я получаю следующее предупреждение:
The extracted code has multiple entry points
Вот подпись метода, которую я планирую использовать:
private void GetRatePlanComponents(ProductPlan productPlan,
ProductRatePlan productRatePlan)
Я искал в Интернете, чтобы понять, что это значит. Но не было большой удачи. Кто-нибудь объяснит это?
Для вашей справки, вот фрагмент кода, который я пытаюсь перейти к отдельному методу:
QueryResult productRatePlanChargeQueryResult =
_zuoraService.query(string.Format(@"select Id, Name, IncludedUnits from
ProductRatePlanCharge where ProductRatePlanId = '{0}' and
ChargeModel = 'Overage Pricing'", productRatePlan.Id));
if (productRatePlanChargeQueryResult.size > 0)
{
foreach (ProductRatePlanCharge productRatePlanCharge
in productRatePlanChargeQueryResult.records)
{
string numberOfUnits = productRatePlanCharge.IncludedUnits.ToString();
if (productRatePlanCharge.Name.Equals("Users"))
{
productPlan.NumberofUsers = numberOfUnits;
}
else if (productRatePlanCharge.Name.Equals("Projects"))
{
productPlan.NumberofProjects = numberOfUnits;
}
else if (productRatePlanCharge.Name.Equals("Storage"))
{
decimal volumeOfStorage;
if (decimal.TryParse(productRatePlanCharge.IncludedUnits.ToString(),
out volumeOfStorage))
{
if (volumeOfStorage < 1) volumeOfStorage *= 1000;
productPlan.VolumeofStorage = volumeOfStorage.ToString();
}
else
{
productPlan.VolumeofStorage = numberOfUnits;
}
}
}
}
}
Ответы
Ответ 1
Похоже, вы столкнулись с известной проблемой:
public static IEnumerable<ITagPrefixHolder> GetRelevantHolders(IPsiSourceFile sourceFile )
{
var targetPath = FileSystemPath.Empty;
var projectFile = sourceFile.ToProjectFile();
if (projectFile != null)
targetPath = projectFile.Location;
foreach(var holder in GetRelevantHoldersBeforeFile(sourceFile, targetPath))
yield return holder;
foreach(var holder in GetHoldersInFile(sourceFile, targetPath))
yield return holder;
}
Выберите оба метода foreach-loops и extract. Это дает странное предупреждение
что фрагмент имеет несколько точек входа (??!) и приводит к
следующий код:
public static IEnumerable<ITagPrefixHolder> GetRelevantHolders(IPsiSourceFile sourceFile )
{
var targetPath = FileSystemPath.Empty;
var projectFile = sourceFile.ToProjectFile();
if (projectFile != null)
targetPath = projectFile.Location;
foreach(var tagPrefixHolder in Foo(sourceFile, targetPath))
yield return tagPrefixHolder;
}
private static IEnumerable<ITagPrefixHolder> Foo(IPsiSourceFile sourceFile, FileSystemPath targetPath)
{
foreach(var holder in GetRelevantHoldersBeforeFile(sourceFile, targetPath))
yield return holder;
foreach(var holder in GetHoldersInFile(sourceFile, targetPath))
yield return holder;
}
Лучше заменить сгенерированный foreach простым return
Foo(sourceFile, targetPath);
.
Ответ 2
Я видел, что ReSharper делает то же самое, когда код, который я пытался извлечь, имел пару выражений throw.
Вы можете сделать то, что я сделал в этом случае, - систематически прокомментировать одну строку за раз, пока не найдете ту, которую переводит ReSharper. Затем вы можете извлечь метод и раскомментировать строку позже.
Или вы можете просто реорганизовать его вручную.