Int를 C #의 Generic Enum으로 캐스팅
유사 캐스트 INT는 C #에서 열거 형 하지만 내 열거 형은 제네릭 형식 매개 변수입니다. 이를 처리 하는 가장 좋은 방법 은 무엇입니까 ?
예:
private T ConvertEnum<T>(int i) where T : struct, IConvertible
{
return (T)i;
}
컴파일러 오류 생성 Cannot convert type 'int' to 'T'
전체 코드는 다음과 같습니다. 여기서 value는 int 또는 null을 포함 할 수 있습니다.
private int? TryParseInt(string value)
{
var i = 0;
if (!int.TryParse(value, out i))
{
return null;
}
return i;
}
private T? TryParseEnum<T>(string value) where T : struct, IConvertible
{
var i = TryParseInt(value);
if (!i.HasValue)
{
return null;
}
return (T)i.Value;
}
내가 찾은 가장 간단한 방법은에 캐스트를 추가하여 컴파일러의 손을 강제하는 것 object
입니다.
return (T)(object)i.Value;
다음은 런타임이 정적 제네릭 클래스의 여러 인스턴스를 생성한다는 사실을 남용하는 매우 빠른 솔루션입니다. 내면의 최적화 악마를 풀어보세요!
이것은 일반적인 방식으로 스트림에서 Enum을 읽을 때 정말 빛납니다. enum의 기본 유형 및 BitConverter를 캐시하는 외부 클래스와 결합하여 멋진 기능을 발휘하십시오.
void Main()
{
Console.WriteLine("Cast (reference): {0}", (TestEnum)5);
Console.WriteLine("EnumConverter: {0}", EnumConverter<TestEnum>.Convert(5));
Console.WriteLine("Enum.ToObject: {0}", Enum.ToObject(typeof(TestEnum), 5));
int iterations = 1000 * 1000 * 100;
Measure(iterations, "Cast (reference)", () => { var t = (TestEnum)5; });
Measure(iterations, "EnumConverter", () => EnumConverter<TestEnum>.Convert(5));
Measure(iterations, "Enum.ToObject", () => Enum.ToObject(typeof(TestEnum), 5));
}
static class EnumConverter<TEnum> where TEnum : struct, IConvertible
{
public static readonly Func<long, TEnum> Convert = GenerateConverter();
static Func<long, TEnum> GenerateConverter()
{
var parameter = Expression.Parameter(typeof(long));
var dynamicMethod = Expression.Lambda<Func<long, TEnum>>(
Expression.Convert(parameter, typeof(TEnum)),
parameter);
return dynamicMethod.Compile();
}
}
enum TestEnum
{
Value = 5
}
static void Measure(int repetitions, string what, Action action)
{
action();
var total = Stopwatch.StartNew();
for (int i = 0; i < repetitions; i++)
{
action();
}
Console.WriteLine("{0}: {1}", what, total.Elapsed);
}
최적화가 활성화 된 Core i7-3740QM의 결과 :
Cast (reference): Value
EnumConverter: Value
Enum.ToObject: Value
Cast (reference): 00:00:00.3175615
EnumConverter: 00:00:00.4335949
Enum.ToObject: 00:00:14.3396366
You should be able to use Enum.Parse
for this:
return (T)Enum.Parse(typeof(T), i.Value.ToString(), true);
This article talks about parsing generic enums for extenstion methods:
Alternatively, if you can get a enum not as a generic type, but as Type, then simply use
Enum.ToObject
https://msdn.microsoft.com/en-us/library/system.enum.toobject(v=vs.110).aspx
public static class Extensions
{
public static T ToEnum<T>(this int param)
{
var info = typeof(T);
if (info.IsEnum)
{
T result = (T)Enum.Parse(typeof(T), param.ToString(), true);
return result;
}
return default(T);
}
}
참고URL : https://stackoverflow.com/questions/10387095/cast-int-to-generic-enum-in-c-sharp
'programing tip' 카테고리의 다른 글
콜백을 매개 변수로 다른 함수에 전달하는 방법 (0) | 2020.10.24 |
---|---|
Python에서 YAML 파일을 구문 분석하고 데이터에 액세스합니까? (0) | 2020.10.24 |
JSHint "엄격한 위반 가능성이 있습니다." (0) | 2020.10.24 |
TGitCache.exe를 정상적으로 중지하고 시작할 수있는 방법 (0) | 2020.10.24 |
iPython에서 Pandas Library를 사용하여 .xlsx 파일을 읽는 방법은 무엇입니까? (0) | 2020.10.24 |