2017-04-25 1 views
6

이것은 정말 쉽다는 느낌입니다.하지만이 방법을 사용할 수있는 방법이 없습니다. 유형 변수를 켜기

Type propType = propertyInfo.PropertyType; 
switch (propType) 
{ 
    case typeof(byte): // Can't do this, 'A constant value is expected' 
    // Do something 
    break; 
} 

제가

또한
private const byteType = typeof(byte); 

을하고 그 위에 스위칭했지만, 코드의 행은 동일한 이유로 컴파일 못한다.

따라서 질문 : Type의 인스턴스를 어떻게 전환합니까?

+0

if/else를 사용하고 싶지 않은 이유가 있습니까? – Orangesandlemons

+0

질문에 문제가 있습니까? @Orangesandlemons –

+2

그게 내가 지금하고있는 일이야.하지만 너는 약 12 ​​개가있을 때, 너는 이것이 스위치가되어야 할지도 모른다고 생각하기 시작한다. – Flynn1179

답변

3

내 초기 답변이 잘못되었습니다. 당신은 타입 스위치에서 이것을 할 수 없습니다. (제 생각에는이 사용에 대해 끔찍한 지적이있는 when을 사용하지 않고). 문제는 Type이 상수가 아니므로 스위치에서 사용할 수 없다는 것입니다.

실제 값을 사용하지 않았으므로 Type 인스턴스로 착각했습니다. if 진술서를 계속 사용해야합니다. 당신은 switch하여이 작업을 수행 할 수

+0

불행히도, 이것은 작동하지 않습니다. '타입 타입의 표현식은 바이트 타입의 패턴으로 처리 할 수 ​​없습니다.'라는 컴파일러가 실패합니다. – Flynn1179

+0

@ Flynn1179 당신이 옳습니다. –

+0

글쎄, 그것은 작동하지만, 하나의 아이디어를 주었지만 ...'case type t where t == typeof (byte)',하지만 실제로는 십여 가지 이상의 실질적인 이점을 제공하지 않는다고 느낀다. else 문. – Flynn1179

2

, 당신은 단지 var 패턴 when 가드를 사용해야합니다 :

Type propType = propertyInfo.PropertyType; 
switch (propType) 
{ 
    case var b when b == typeof(byte): 
     // Do something 
     break; 
} 
0

당신이 Typeswitch를 사용하여 설정되어있는 경우, 난 당신이 몇 가지 선택이 모두 매우 가난한 사람들을 생각 .

첫 번째 옵션은 TypeCode을 사용하는 것, 예컨대 :

switch (Type.GetTypeCode(propType)) 
{ 
    case TypeCode.Byte: 
    // Do something 
    break; 
} 

가 내장 the TypeCode enum에있는 유형에만 몇 가지를 지원하기 때문에이 방법을 심각하게 제한됩니다.

또 다른 옵션은 유형 이름을 전환하는 것입니다 : 당신이 네임 스페이스를 포함하여, 이름이 오타가 확인되지 않습니다 전체 이름을 작성해야하기 때문에, 하나

switch (propType.FullName) 
{ 
    case "System.Byte": 
    // Do something 
    break; 
} 

이 크지 않다 이러한 switch는 것 "가짜"System.Byte 유형 (즉, .Net에 포함되지 않은 System.Byte이라는 사용자 정의 유형)을 허용하십시오.

+1

@downvoter이 답변에 잘못이 있다고 생각합니까? – svick

관련 문제