2011-02-10 3 views
4

나는 유형 T의 변수 x와 문자열에있는 값을가집니다. 예를 들어 나는이 :런타임에 유형 지정

bool x, value = "True" 
int x, value = "1" 
  • x에 값을 역 직렬화/분석/할당하는 일반적인 방법이 있나요?

T는 참조 된 또는 기본 유형!

+1

문제는 당신이하지 않은 것입니다 ** 할당 ** 유형, 당신은 ** ** ** 값을 변환합니다. 따라서'string'을'anything'로 변환하는 방법을 제공해야합니다. 'Parse' 메쏘드와 같이 ... 당신은 그것을 위해 reflection을 사용할 수 있습니다. –

답변

5

Convert.ChangeType method을 사용할 수 있습니다.

모든 기본 유형 변환에 대해 다룹니다.

예 : 당신은 또한 당신이 또는 다른 유형에 자신의 객체를 변환에 사용할 수있는 IConvertible interface 좀 걸릴 수 있습니다 var i = Convert.ChangeType("1", typeof(int));

.

마지막으로 codymanix에서 말한 것처럼 OOB XmlSerialization 또는 이진 직렬화를 사용하여 개체를 직렬화 할 수 있습니다.

[편집] 대상 유형이 같은 유틸리티 클래스에 convert.ChangeType 방법을 포장하여 전환하는 경우는 컴파일시에 확인할 수 있습니다

public static class ConvertUtility 
{ 
    public static T Convert<T>(object source) where T : IConvertible 
    { 
     return (T)System.Convert.ChangeType(source, typeof(T)); 
    }    
} 
+0

@Steve Convert.ChangeType을 시도했습니다. 그러나 모든 기본 유형이 IConvertible을 구현하는 것은 아닙니다. 내가 시도한 Convert.ChangeType (value, typeof (T)); –

+0

+1 @ 스티브 이상한 나는 다시 시도하고 같은 문제가 발생하지 않습니다. –

+0

@ amir : 내 편집을보세요 ... 도움이 될 수도 있습니다 –

0

내가하는 것보다 다른 방법을 알고 :

object x; 
if (theType==typeof(int)) 
    x = int.parse(myString); 
else if (theType==typeof(bool)) 
    x = bool.Parse(myString); 
// and so on for other types.. 

이 또한 그렇지 않으면 "123"하면 알 수있는 기회가 없기 때문에 직렬화 된 데이터 유형 이름을 포함해야합니다 int 형 또는 서명되지 않은 짧은이든입니다 예를 들어 "Red"가 열거 형 값이면 Color 객체 또는 문자열입니다.

XmlSerializer 또는 BinaryFormatter을 사용하면 개체를 serialize/deserialize 할 수 있습니다.이 모든 논리가 이미 수행됩니다.

1

나는이 반사 기반 접근법을 얼마 전에 작성했습니다. 그것은 상대적으로 테스트되지 않았습니다. ParseTryParse이라는 메서드를 찾습니다. 그리고 로캘 (in) 종속 구문 분석도 처리하지 않았습니다.

private static class ParseDelegateStore<T> 
    { 
     public static ParseDelegate<T> Parse; 
     public static TryParseDelegate<T> TryParse; 
    } 

    private delegate T ParseDelegate<T>(string s); 
    private delegate bool TryParseDelegate<T>(string s, out T result); 


    public static T Parse<T>(string s) 
    { 
     ParseDelegate<T> parse = ParseDelegateStore<T>.Parse; 
     if (parse == null) 
     { 
      parse = (ParseDelegate<T>)Delegate.CreateDelegate(typeof(ParseDelegate<T>), typeof(T), "Parse", true); 
      ParseDelegateStore<T>.Parse = parse; 
     } 
     return parse(s); 
    } 

    public static bool TryParse<T>(string s, out T result) 
    { 
     TryParseDelegate<T> tryParse = ParseDelegateStore<T>.TryParse; 
     if (tryParse == null) 
     { 
      tryParse = (TryParseDelegate<T>)Delegate.CreateDelegate(typeof(TryParseDelegate<T>), typeof(T), "TryParse", true); 
      ParseDelegateStore<T>.TryParse = tryParse; 
     } 
     return tryParse(s, out result); 
    } 
+0

정말 대단해! 아주 잘 작동합니다! –

관련 문제