다른 클래스의 “속성”을 저장하는 데 사용하려는 클래스가 있습니다. 이러한 속성에는 단순히 이름과 값이 있습니다. 이상적으로 는 내가 원하는 것은 유형이 지정된 속성 을 추가 하여 반환 된 “값”이 항상 원하는 유형이되도록하는 것입니다.
유형은 항상 기본 형식이어야합니다. 이 클래스는 기본적으로 이름과 값을 문자열로 저장하는 추상 클래스를 서브 클래스합니다. 이 서브 클래스는 기본 클래스에 유형 안전성을 추가 할뿐만 아니라 변환을 절약 할 수 있다는 아이디어입니다.
그래서 나는 (거의)이 클래스를 만들었습니다.
public class TypedProperty<DataType> : Property
{
public DataType TypedValue
{
get { // Having problems here! }
set { base.Value = value.ToString();}
}
}
따라서 질문은 다음과 같습니다.
문자열에서 기본으로 다시 변환하는 “일반적인”방법이 있습니까?
보드 전체에서 변환을 연결하는 일반적인 인터페이스를 찾을 수없는 것 같습니다 ( ITryParsable 과 같은 것이 이상적 이었습니다 ).
답변
나는 당신의 의도를 올바르게 이해했는지 확실하지 않지만 이것이 도움이되는지 봅시다.
public class TypedProperty<T> : Property where T : IConvertible
{
public T TypedValue
{
get { return (T)Convert.ChangeType(base.Value, typeof(T)); }
set { base.Value = value.ToString();}
}
}
답변
lubos hasko의 메소드는 널 입력 가능에 실패합니다. 아래 방법은 nullable에 적용됩니다. 그래도 나는 그것을 찾지 못했습니다. Google을 통해 찾았습니다. http://web.archive.org/web/20101214042641/http://dogaoztuzun.com/post/C-Generic-Type-Conversion.aspx “Tuna Toksoz”에 대한 크레딧
먼저 사용법 :
TConverter.ChangeType<T>(StringValue);
수업은 아래와 같습니다.
public static class TConverter
{
public static T ChangeType<T>(object value)
{
return (T)ChangeType(typeof(T), value);
}
public static object ChangeType(Type t, object value)
{
TypeConverter tc = TypeDescriptor.GetConverter(t);
return tc.ConvertFrom(value);
}
public static void RegisterTypeConverter<T, TC>() where TC : TypeConverter
{
TypeDescriptor.AddAttributes(typeof(T), new TypeConverterAttribute(typeof(TC)));
}
}
답변
많은 유형 (정수, double, DateTime 등)에는 정적 구문 분석 방법이 있습니다. 리플렉션을 사용하여 호출 할 수 있습니다.
MethodInfo m = typeof(T).GetMethod("Parse", new Type[] { typeof(string) } );
if (m != null)
{
return m.Invoke(null, new object[] { base.Value });
}
답변
TypeDescriptor.GetConverter(PropertyObject).ConvertFrom(Value)
TypeDescriptor
는 객체 GetConvertor
를 받아들이는 메소드 를 가진 클래스 이며, 지정된 객체를 위해 메소드를 Type
호출 ConvertFrom
하여 변환 할 수 있습니다 value
.
답변
traits 클래스 와 같은 구문을 사용할 수 있습니다 . 이런 식으로, 문자열을 자체 유형의 값으로 변환하는 방법을 알고있는 매개 변수화 된 헬퍼 클래스가 있습니다. 그러면 getter가 다음과 같이 보일 수 있습니다.
get { return StringConverter<DataType>.FromString(base.Value); }
이제 매개 변수화 된 형식에 대한 내 경험은 C ++ 및 해당 템플릿으로 제한되지만 C # 제네릭을 사용하여 같은 종류의 작업을 수행 할 수있는 방법이 있다고 생각합니다.
답변
정전기를 확인하십시오 Nullable.GetUnderlyingType
. -기본 유형이 null 인 경우 템플릿 매개 변수가 아니고 Nullable
해당 유형을 직접 사용할 수 있습니다. 기본 유형이 null이 아닌 경우 기본 유형을 변환에 사용합니다.
나를 위해 일하는 것 같습니다 :
public object Get( string _toparse, Type _t )
{
// Test for Nullable<T> and return the base type instead:
Type undertype = Nullable.GetUnderlyingType(_t);
Type basetype = undertype == null ? _t : undertype;
return Convert.ChangeType(_toparse, basetype);
}
public T Get<T>(string _key)
{
return (T)Get(_key, typeof(T));
}
public void test()
{
int x = Get<int>("14");
int? nx = Get<Nullable<int>>("14");
}
답변
Bob 의 답변 에서 영감을 얻은 이러한 확장은 null 값 변환과 모든 기본 변환을 앞뒤로 지원합니다.
public static class ConversionExtensions
{
public static object Convert(this object value, Type t)
{
Type underlyingType = Nullable.GetUnderlyingType(t);
if (underlyingType != null && value == null)
{
return null;
}
Type basetype = underlyingType == null ? t : underlyingType;
return System.Convert.ChangeType(value, basetype);
}
public static T Convert<T>(this object value)
{
return (T)value.Convert(typeof(T));
}
}
예
string stringValue = null;
int? intResult = stringValue.Convert<int?>();
int? intValue = null;
var strResult = intValue.Convert<string>();