사용자 입력 데이터의 유효성을 검사하고 런타임에 지정된 유형으로 문자열 값을 변환 할 수 있도록해야합니다. 반드시 실제 변환을 수행 할 필요는 없으며 입력 값이 유효한지 테스트해야합니다. 이런 유형의 평가를 수행 할 클래스 또는 메소드를 찾지 못했습니다. 그러나 누락 된 사항이 있으면 알려주십시오. 사용할 수있는 특정 버전의 솔루션이 있으면 C# 4.0으로 작업하고 있습니다.C#에서 문자열을 주어진 유형으로 변환 할 수 있는지 확인하십시오.
이 메서드는 "표준"형식 (기본 제공 값 데이터 형식과 String) 만 처리하면됩니다. 평가할 필요가있는 유일한 사용자 정의 유형은 라이브러리에 정의 된 특정 enum 유형입니다.
나는 현재 무게를 측정하고 있지만 둘 다 완벽하지 않기 때문에 3 번째 옵션 (또는 내가 놓친 프레임 워크에 내장 된 것)이 있었으면합니다. 솔루션 # 1에서 try-catch를 사용하면 문제가있는 것 같아서 솔루션 # 2쪽으로 크게 기울고 있습니다.
해결 방법 1 : Convert.ChangeType()
시도/캐치
public Boolean CheckType(String value, Type type)
{
try
{
var obj = Convert.ChangeType(value, type);
return true;
}
catch(InvalidCastException)
{
return false;
}
catch(FormatException)
{
return false;
}
catch(OverflowException)
{
return false;
}
catch(ArgumentNullException)
{
return false;
}
}
해결 방법 2 경우이 방법도 수백 또는 호출 할 수
public Boolean CheckType(String value, Type type)
{
if (type == typeof(String))
{
return true;
}
else if (type == typeof(Boolean))
{
Boolean b;
return Boolean.TryParse(value, out b);
}
else if (type == typeof(Int32))
{
Int32 i;
return Int32.TryParse(value, out i);
}
else if (type == typeof(Int64))
{
Int64 l;
return Int64.TryParse(value, out l);
}
// similar code to check all other types
// (Int16, UInt32, UInt64, UInt16, Byte, SByte, Single, Double, Decimal,
// Enum, Char, DateTime)
.
.
.
.
.
else
throw new ArgumentException("Invalid type evaluation");
}
/다른 유형 검사 체인 및 TryParse 입력 데이터가 심각하게 엉망이거나 손상된 경우 짧은 간격으로 수천 번 반복되므로 반복되는 if/else 검사가 performa에 대한 드래그가 될지 걱정됩니다. nce (필자는이 시점에서 반드시 최적화하려고하지 않고 다른 옵션을 고려해야 함).
두 솔루션에서 내가 가진 다른 문제는 실제로 예상되는 형식의 새 값으로 문자열 값을 변환하고 두 경우 모두 결과를 삼키는 것입니다.
@JeremyMcGee 난 당신이 링크 된 질문을보고 있지만, 실제로 값을 변환 할 찾고 있지 않다 때문에, 그냥 변환 할 수있는, 내 질문은 반드시 중복 생각하지 않았다 테스트합니다. – psubsee2003
@ psubsee2003 : 무언가를 변환 할 수 있는지, 실제로 변환 할 수 있는지를 확인하는 노력은 일반적으로 매우 적습니다. – Joe
@Joe 필자는 그럴듯한 느낌이 들었지만 TryParse 메서드가 명백한 예외없이 매우 빠르기 때문에 변환하기 전에 먼저 확인해야 할 방법이 있는지 궁금해하고있었습니다. – psubsee2003