-
Notifications
You must be signed in to change notification settings - Fork 386
/
EnumToBoolConverter.shared.cs
62 lines (53 loc) · 1.95 KB
/
EnumToBoolConverter.shared.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using System.Globalization;
using System.Reflection;
namespace CommunityToolkit.Maui.Converters;
/// <summary>
/// Convert an <see cref="Enum" /> to corresponding <see cref="bool" />
/// </summary>
public class EnumToBoolConverter : BaseConverterOneWay<Enum, bool, Enum?>
{
/// <inheritdoc/>
public override bool DefaultConvertReturnValue { get; set; } = false;
/// <summary>
/// Enum values, that converts to <c>true</c> (optional)
/// </summary>
public IList<Enum> TrueValues { get; } = [];
/// <summary>
/// Convert an <see cref="Enum" /> to corresponding <see cref="bool" />
/// </summary>
/// <param name="value"><see cref="Enum" /> value to convert</param>
/// <param name="parameter">
/// Additional parameter for converter. Can be used for comparison instead of
/// <see cref="TrueValues" />
/// </param>
/// <param name="culture">The culture to use in the converter. This is not implemented.</param>
/// <returns>
/// False, if the value is not in <see cref="TrueValues" />. False, if <see cref="TrueValues" /> is empty and
/// value not equal to parameter.
/// </returns>
/// <exception cref="ArgumentException">If value is not an <see cref="Enum" /></exception>
public override bool ConvertFrom(Enum value, Enum? parameter = null, CultureInfo? culture = null)
{
ArgumentNullException.ThrowIfNull(value);
return TrueValues.Count == 0
? CompareTwoEnums(value, parameter)
: TrueValues.Any(item => CompareTwoEnums(value, item));
static bool CompareTwoEnums(in Enum valueToCheck, in Enum? referenceEnumValue)
{
if (referenceEnumValue is null)
{
return false;
}
var valueToCheckType = valueToCheck.GetType();
if (valueToCheckType != referenceEnumValue.GetType())
{
return false;
}
if (valueToCheckType.GetTypeInfo().GetCustomAttribute<FlagsAttribute>() != null)
{
return referenceEnumValue.HasFlag(valueToCheck);
}
return Equals(valueToCheck, referenceEnumValue);
}
}
}