구문 분석을 사용하여 문자열을 모든 유형으로 변환하는 일반 Parse () 함수가 있습니까?


93

내가 좋아하는 제네릭 형식 문자열을 변환 할 int이나 date또는 long일반 반환 형식에 따라.

기본적으로 이와 같은 함수 Parse<T>(String)는 유형의 항목을 반환합니다 T.

예를 들어 int가 전달 된 경우 함수는 int.parse내부적으로 수행해야합니다 .

답변:


134

System.Convert.ChangeType

귀하의 예에 따라 다음을 수행 할 수 있습니다.

int i = (int)Convert.ChangeType("123", typeof(int));
DateTime dt = (DateTime)Convert.ChangeType("2009/12/12", typeof(DateTime));

"일반 반환 유형"요구 사항을 충족하기 위해 자체 확장 메서드를 작성할 수 있습니다.

public static T ChangeType<T>(this object obj)
{
    return (T)Convert.ChangeType(obj, typeof(T));
}

이렇게하면 다음을 수행 할 수 있습니다.

int i = "123".ChangeType<int>();

멋지지만 이상한 것은 ChangeType이라는 이름입니다. 그래서 저는이 함수가 어떤 종류의 캐스트를하고 파싱하지 않는다고 생각했을 것입니다.
Karim

7
MSDN은 소스 개체에서 올바른 변환 방법을 찾는 것은 단순히 IConvertible 인터페이스를 구현해야하는 래퍼라고 말합니다.
Ani

구현 IConvertable해야하는 경우 T, 즉 T ChangeType<T>(this object obj) where T : IConvertable?
Liam

2
@Liam : 아니요, obj이어야합니다 IConvertible.하지만 컴파일 타임에 지정할 방법이 없습니다.
Ani

실패한 경우 null 또는 false를 반환하는 TryChangeType과 같은 것이 필요한 경우? 예외를 잡아서 만?
희망없는

22

이 스레드에 답변하기에는 너무 늦은 것 같습니다. 하지만 여기에 내 구현이 있습니다.

기본적으로 Object 클래스에 대한 Extention 메서드를 만들었습니다. 모든 유형, 즉 nullable, 클래스 및 구조체를 처리합니다.

 public static T ConvertTo<T>(this object value)
           {
               T returnValue;

               if (value is T variable)
                   returnValue = variable;
               else
                   try
                   {
                       //Handling Nullable types i.e, int?, double?, bool? .. etc
                       if (Nullable.GetUnderlyingType(typeof(T)) != null)
                       {
                           TypeConverter conv = TypeDescriptor.GetConverter(typeof(T));
                           returnValue = (T) conv.ConvertFrom(value);
                       }
                       else
                       {
                           returnValue = (T) Convert.ChangeType(value, typeof(T));
                       }
                   }
                   catch (Exception)
                   {
                       returnValue = default(T);
                   }

               return returnValue;
           }

그것은 또한 "널 (NULL)"-aspect 포함 원인 이럴이 더 나은 해답
올레 알버스

TypeDescriptornullable 형식과 nullable Convert.ChangeType이 아닌 형식에 사용하는 특별한 이유가 있습니까? 이 전체 try블록은 TypeConverter2 줄의 코드 로만 줄일 수 있으며 nullable 및 non-nullable 모두에서 작동합니다.
IMujagic


9

Pranay의 대답의 더 깨끗한 버전

public static T ConvertTo<T>(this object value)
{
    if (value is T variable) return variable;

    try
    {
        //Handling Nullable types i.e, int?, double?, bool? .. etc
        if (Nullable.GetUnderlyingType(typeof(T)) != null)
        {
            return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(value);
        }

        return (T)Convert.ChangeType(value, typeof(T));
    }
    catch (Exception)
    {
        return default(T);
    }
}

0

.NET에는 한 유형의 개체를 다른 유형으로 변환하는 몇 가지 규칙이 있습니다.

그러나 이러한 방법은 일반적인 방법보다 훨씬 느리므로 T.Parse(string)단일 값을 변환 할 때마다 많은 할당이 필요합니다.

들어 여기서, valueString , 나는 반사를 사용하여 유형의 적절한 정적 분석 방법을 찾으를 호출 람다 식을 구축하고 향후 사용을 위해 컴파일 된 대리자를 (참조 캐시 선택 이 답변 의 예를 들어).

또한 유형에 적합한 구문 분석 방법이없는 경우 위에서 언급 한 방법으로 대체됩니다 ( 추가 정보 의 성능 섹션 참조).

var v = new ValueString("15"); // struct
var i = v.As<int>(); // Calls int.Parse.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.