나는 유형 T의 변수 x와 문자열에있는 값을가집니다. 예를 들어 나는이 :런타임에 유형 지정
bool x, value = "True"
int x, value = "1"
- x에 값을 역 직렬화/분석/할당하는 일반적인 방법이 있나요?
T는 참조 된 또는 기본 유형!
나는 유형 T의 변수 x와 문자열에있는 값을가집니다. 예를 들어 나는이 :런타임에 유형 지정
bool x, value = "True"
int x, value = "1"
T는 참조 된 또는 기본 유형!
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));
}
}
@Steve Convert.ChangeType을 시도했습니다. 그러나 모든 기본 유형이 IConvertible을 구현하는 것은 아닙니다. 내가 시도한 Convert.ChangeType (value, typeof (T)); –
+1 @ 스티브 이상한 나는 다시 시도하고 같은 문제가 발생하지 않습니다. –
@ amir : 내 편집을보세요 ... 도움이 될 수도 있습니다 –
내가하는 것보다 다른 방법을 알고 :
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 할 수 있습니다.이 모든 논리가 이미 수행됩니다.
나는이 반사 기반 접근법을 얼마 전에 작성했습니다. 그것은 상대적으로 테스트되지 않았습니다. Parse
및 TryParse
이라는 메서드를 찾습니다. 그리고 로캘 (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);
}
정말 대단해! 아주 잘 작동합니다! –
문제는 당신이하지 않은 것입니다 ** 할당 ** 유형, 당신은 ** ** ** 값을 변환합니다. 따라서'string'을'anything'로 변환하는 방법을 제공해야합니다. 'Parse' 메쏘드와 같이 ... 당신은 그것을 위해 reflection을 사용할 수 있습니다. –