Интерполяция строк в Visual Studio 2015 и IFormatProvider (CA1305)
новый стиль интерполяции строк в Visual Studio 2015 выглядит следующим образом:
Dim s = $"Hello {name}"
но если я использую это, анализ кода говорит мне, что я ломаю CA1305: укажите IFormatProvider
в старые времена я делал так:
Dim s = String.Format(Globalization.CultureInfo.InvariantCulture, "Hello {0}", name)
но как это можно сделать с новым стилем?
Я должен упомянуть, что я ищу решение для .Net 4.5.2 (для .Net 4.6 dcastro имеет ответ)
3 ответов
можно использовать System.FormattableString
или System.IFormattable
класс:
IFormattable ifs = (IFormattable)$"Hello, {name}";
System.FormattableString fss = $"Hello, {name}";
// pass null to use the format as it was used upon initialization above.
string ifresult = ifs.ToString(null, CultureInfo.InvariantCulture);
string fsresult = fss.ToString(CultureInfo.InvariantCulture);
вам нужно компилировать с Framework 4.6, как IFromattable
и FormattableString
- это классы, которые не существуют в более старых версиях. Так что если вы нацелены на более старые версии .NET framework вы не можете использовать синтаксис интерполяции, не вызывая ошибки.
если вы не применяете немного взломать (адаптировано для компиляции против 4.6 RTM из gist Джона Скита и раскошелились на мой собственный счет!--15-->.). Просто добавьте файл класса в проект, содержащий:
обновление
теперь также есть доступен пакет Nuget, который обеспечит ту же функциональность для вашего проекта (спасибо, что довел это до моего сведения @habakuk).
install-package StringInterpolationBridge
или, если вы хотите достичь того же, не добавляя дополнительную сборку к вашему продукту, добавьте следующий код в свой проект:
namespace System.Runtime.CompilerServices
{
internal class FormattableStringFactory
{
public static FormattableString Create(string messageFormat, params object[] args)
{
return new FormattableString(messageFormat, args);
}
}
}
namespace System
{
internal class FormattableString : IFormattable
{
private readonly string messageFormat;
private readonly object[] args;
public FormattableString(string messageFormat, object[] args)
{
this.messageFormat = messageFormat;
this.args = args;
}
public override string ToString()
{
return string.Format(messageFormat, args);
}
public string ToString(string format, IFormatProvider formatProvider)
{
return string.Format(formatProvider, format ?? messageFormat, args);
}
public string ToString(IFormatProvider formatProvider)
{
return string.Format(formatProvider, messageFormat, args);
}
}
}
посмотреть:
если вы нацелены на .NET Framework 4.6, вы можете воспользоваться тем фактом, что строковые интерполяции неявно конвертируются в FormattableString
:
С настройка интерполяции строк в C# 6 Томас Левек
менее известный аспект этой функции состоит в том, что интерполированная строка может рассматриваться как
String
илиIFormattable
в зависимости от контекста.
static string Invariant(FormattableString formattable)
{
return formattable.ToString(CultureInfo.InvariantCulture);
}
string text = Invariant($"{p.Name} was born on {p.DateOfBirth:D}");
Я нашел NuGet-пакет, который охватывает код, который jessehouwing представил в своем ответе.
пакет Nuget 'StringInterpolationBridge' (источник) добавляет этот код в каждый проект.