Skip to content

Commit a0acee8

Browse files
authored
add Enum.TryFormat (#320)
1 parent d670ed4 commit a0acee8

File tree

5 files changed

+68
-5
lines changed

5 files changed

+68
-5
lines changed

apiCount.include.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
**API count: 542**
1+
**API count: 543**

api_list.include.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,7 @@
572572
* `TEnum Parse<TEnum>(ReadOnlySpan<char>) where TEnum : struct, Enum` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-readonlyspan((system-char))))
573573
* `TEnum Parse<TEnum>(string, bool) where TEnum : struct, Enum` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-string-system-boolean))
574574
* `TEnum Parse<TEnum>(string) where TEnum : struct, Enum` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-string-system-boolean))
575+
* `bool TryFormat<TEnum>(TEnum, Span<char>, int, ReadOnlySpan<char>) where TEnum : struct, Enum` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.tryformat)
575576
* `bool TryParse<TEnum>(ReadOnlySpan<char>, bool, TEnum) where TEnum : struct, Enum` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.tryparse#system-enum-tryparse-1(system-readonlyspan((system-char))-system-boolean-0@))
576577
* `bool TryParse<TEnum>(ReadOnlySpan<char>, TEnum) where TEnum : struct, Enum` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.tryparse#system-enum-tryparse-1(system-readonlyspan((system-char))-0@))
577578

readme.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ The package targets `netstandard2.0` and is designed to support the following ru
1212
* `net5.0`, `net6.0`, `net7.0`, `net8.0`, `net9.0`, `net10.0`
1313

1414

15-
**API count: 542**<!-- singleLineInclude: apiCount. path: /apiCount.include.md -->
15+
**API count: 543**<!-- singleLineInclude: apiCount. path: /apiCount.include.md -->
1616

1717

1818
**See [Milestones](../../milestones?state=closed) for release notes.**
@@ -767,9 +767,9 @@ The class `Polyfill` includes the following extension methods:
767767

768768
#### Random
769769

770-
* `void GetItems<T>(Random, ReadOnlySpan<T>, Span<T>)`
771-
* `T[] GetItems<T>(Random, ReadOnlySpan<T>, int)`
772-
* `T[] GetItems<T>(Random, T[], int)`
770+
* `void GetItems<T>(Random, ReadOnlySpan<T>, Span<T>)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.random.getitems#system-random-getitems-1(system-readonlyspan((-0))-system-span((-0))))
771+
* `T[] GetItems<T>(Random, ReadOnlySpan<T>, int)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.random.getitems#system-random-getitems-1(system-readonlyspan((-0))-system-int32))
772+
* `T[] GetItems<T>(Random, T[], int)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.random.getitems#system-random-getitems-1(-0()-system-int32))
773773
* `void NextBytes(Random, Span<byte>)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.random.nextbytes#system-random-nextbytes(system-span((system-byte))))
774774
* `void Shuffle<T>(Random, T[])` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.random.nextbytes#system-random-nextbytes(system-span((system-byte))))
775775
* `void Shuffle<T>(Random, Span<T>)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.random.nextbytes#system-random-nextbytes(system-span((system-byte))))
@@ -1046,6 +1046,7 @@ The class `Polyfill` includes the following extension methods:
10461046
* `TEnum Parse<TEnum>(ReadOnlySpan<char>) where TEnum : struct, Enum` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-readonlyspan((system-char))))
10471047
* `TEnum Parse<TEnum>(string, bool) where TEnum : struct, Enum` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-string-system-boolean))
10481048
* `TEnum Parse<TEnum>(string) where TEnum : struct, Enum` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-string-system-boolean))
1049+
* `bool TryFormat<TEnum>(TEnum, Span<char>, int, ReadOnlySpan<char>) where TEnum : struct, Enum` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.tryformat)
10491050
* `bool TryParse<TEnum>(ReadOnlySpan<char>, bool, TEnum) where TEnum : struct, Enum` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.tryparse#system-enum-tryparse-1(system-readonlyspan((system-char))-system-boolean-0@))
10501051
* `bool TryParse<TEnum>(ReadOnlySpan<char>, TEnum) where TEnum : struct, Enum` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.tryparse#system-enum-tryparse-1(system-readonlyspan((system-char))-0@))
10511052

src/Polyfill/EnumPolyfill.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,5 +133,37 @@ public static bool TryParse<TEnum>(ReadOnlySpan<char> value, bool ignoreCase, ou
133133
#else
134134
Enum.TryParse<TEnum>(value.ToString(), ignoreCase, out result);
135135
#endif
136+
137+
/// <summary>
138+
/// Tries to format the value of the enumerated type instance into the provided span of characters.
139+
/// </summary>
140+
//Link: https://learn.microsoft.com/en-us/dotnet/api/system.enum.tryformat
141+
public static bool TryFormat<TEnum>(TEnum value, Span<char> destination, out int charsWritten, ReadOnlySpan<char> format = default)
142+
where TEnum : struct, Enum
143+
{
144+
#if NET8_0_OR_GREATER
145+
return Enum.TryFormat<TEnum>(value, destination, out charsWritten, format);
146+
#else
147+
string result;
148+
if (format.Length == 0)
149+
{
150+
result = value.ToString();
151+
}
152+
else
153+
{
154+
result = Enum.Format(typeof(TEnum), value, format.ToString());
155+
}
156+
157+
if (result.Length > destination.Length)
158+
{
159+
charsWritten = 0;
160+
return false;
161+
}
162+
163+
charsWritten = result.Length;
164+
result.CopyTo(destination);
165+
return true;
166+
#endif
167+
}
136168
#endif
137169
}

src/Tests/PolyfillTests_Enum.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,34 @@ public void TryParse()
5656
Assert.True(result);
5757
}
5858

59+
enum Colors { Red, Green, Blue }
60+
61+
[Test]
62+
public void EnumTryFormat_ValidValue()
63+
{
64+
Span<char> buffer = stackalloc char[10];
65+
var result = EnumPolyfill.TryFormat(Colors.Green, buffer, out var charsWritten);
66+
Assert.IsTrue(result);
67+
Assert.AreEqual("Green", buffer[..charsWritten].ToString());
68+
}
69+
70+
[Test]
71+
public void EnumTryFormat_BufferTooSmall()
72+
{
73+
Span<char> buffer = stackalloc char[3];
74+
var result = EnumPolyfill.TryFormat(Colors.Blue, buffer, out var charsWritten);
75+
Assert.IsFalse(result);
76+
Assert.AreEqual(0, charsWritten);
77+
}
78+
79+
[Test]
80+
public void EnumTryFormat_WithFormatSpecifier()
81+
{
82+
Span<char> buffer = stackalloc char[10];
83+
var result = EnumPolyfill.TryFormat(Colors.Red, buffer, out var charsWritten, "G");
84+
Assert.IsTrue(result);
85+
Assert.AreEqual("Red", buffer[..charsWritten].ToString());
86+
}
87+
5988
#endif
6089
}

0 commit comments

Comments
 (0)