Добавление Статического Свойства Благодаря Расширениям
Вот простой сценарий: у вас есть StringComparer, и вы хотите добавить свой собственный компаратор — например, порядок «естественной сортировки», чтобы «file2» сортировался перед «file10», а не после.
Начиная с C#14 мы можем расширить семейство компараторов и сделать это естественным!
Пре-C#14
Итак, мы хотим добавить и использовать что-то вроде:
public class NaturalSortComparer : StringComparer
{
public override int Compare(string? x, string? y)
=> …
public override bool Equals(string? x, string? y)
=> …
public override int GetHashCode(string obj)
=> …
}
До C#14 у нас были только методы расширения, поэтому мы могли сделать только что-то такое:
public static class StringComparerExtensions
{
public static StringComparer NaturalSort(
this StringComparer comparer)
=> new NaturalSortComparer();
}
Что было бы странно использовать:
StringComparer.NaturalSort();. Если вы посмотрите на аналогичные члены, вроде StringComparer.Ordinal или StringComparer.OrdinalIgnoreCase, то это не совсем то, что мы бы хотели.В качестве альтернативы мы могли создать отдельный класс:
public static class NaturalSort
{
public static StringComparer Instance { get; }
= new NaturalSortComparer();
}
// Использование:
var files = Directory.GetFiles(path)
.OrderBy(f => f, NaturalSort.Instance);
Тоже выглядит не совсем естественно.
C#14
«Расширенные» (простите за каламбур) расширения в C#14 могут также добавлять статические члены, не только методы, но и свойства. Кроме того, в перечислении
CompareOptions был добавлен элемент NumericOrdering для натуральной сортировки. Поэтому мы можем создать такое статическое свойство-расширение:public static class StringComparerExtensions
{
extension(StringComparer)
{
public static StringComparer NaturalSort =>
StringComparer.Create(
CultureInfo.CurrentCulture,
CompareOptions.NumericOrdering
);
}
}
Теперь мы можем использовать его так, как и хотелось:
var files = Directory.GetFiles(path)
.OrderBy(f => f, StringComparer.NaturalSort);
Источник: https://steven-giesel.com/blogPost/605274d2-719b-4b1f-b0d5-3ad9001d9b56/adding-static-getter-thanks-to-extensions