[C#] 일반 유형 변환 FROM 문자열

다른 클래스의 “속성”을 저장하는 데 사용하려는 클래스가 있습니다. 이러한 속성에는 단순히 이름과 값이 있습니다. 이상적으로 는 내가 원하는 것은 유형이 지정된 속성 을 추가 하여 반환 된 “값”이 항상 원하는 유형이되도록하는 것입니다.

유형은 항상 기본 형식이어야합니다. 이 클래스는 기본적으로 이름과 값을 문자열로 저장하는 추상 클래스를 서브 클래스합니다. 이 서브 클래스는 기본 클래스에 유형 안전성을 추가 할뿐만 아니라 변환을 절약 할 수 있다는 아이디어입니다.

그래서 나는 (거의)이 클래스를 만들었습니다.

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>();