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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
using System;
using System.Collections;
using System.Collections.Generic;
namespace UniGLTF
{
public sealed class CacheEnum
{
public static T Parse<T>(string name, bool ignoreCase = false) where T : struct, Enum
{
if(ignoreCase)
{
return CacheParse<T>.ParseIgnoreCase(name);
}
else
{
return CacheParse<T>.Parse(name);
}
}
public static T TryParseOrDefault<T>(string name, bool ignoreCase = false, T defaultValue=default(T)) where T : struct, Enum
{
try
{
if(ignoreCase)
{
return CacheParse<T>.ParseIgnoreCase(name);
}
else
{
return CacheParse<T>.Parse(name);
}
}
catch
{
return defaultValue;
}
}
public static T[] GetValues<T>() where T : struct, Enum
{
return CacheValues<T>.Values;
}
private static class CacheParse<T> where T : struct, Enum
{
private static Dictionary<string, T> _values = new Dictionary<string, T>();
private static Dictionary<string, T> _ignoreCaseValues = new Dictionary<string, T>(StringComparer.OrdinalIgnoreCase);
static CacheParse()
{
}
public static T ParseIgnoreCase(string name)
{
if(_ignoreCaseValues.TryGetValue(name, out var value))
{
return value;
}
else
{
T result;
value = Enum.TryParse<T>(name, true, out result)
? result
: throw new ArgumentException(nameof(result));
_ignoreCaseValues.Add(name, value);
return value;
}
}
public static T Parse(string name)
{
if(_values.TryGetValue(name, out var value))
{
return value;
}
else
{
T result;
value = Enum.TryParse<T>(name, false, out result)
? result
: throw new ArgumentException(nameof(result));
_values.Add(name, value);
return value;
}
}
}
private static class CacheValues<T> where T : struct, Enum
{
public static readonly T[] Values;
static CacheValues()
{
Values = Enum.GetValues(typeof(T)) as T[];
}
}
}
}
|