문제

다른 클래스의 "속성"을 저장하는 데 사용하려는 클래스가 있습니다.이러한 속성에는 이름과 값만 있습니다.이상적으로는 내가 원하는 것은 타이핑된 반환된 "값"이 항상 내가 원하는 유형이 되도록 합니다.

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

그래서 저는 (대략) 다음과 같은 클래스를 만들었습니다.

public class TypedProperty<DataType> : Property
{
    public DataType TypedValue
    {
        get { // Having problems here! }
        set { base.Value = value.ToString();}
    }
}

질문은 다음과 같습니다.

문자열을 다시 기본 형식으로 변환하는 "일반적인" 방법이 있습니까?

전반적으로 변환을 연결하는 일반적인 인터페이스를 찾을 수 없는 것 같습니다(예: ITrryParsable 이상적이었을 것입니다!).

도움이 되었습니까?

해결책

제가 귀하의 의도를 올바르게 이해했는지 잘 모르겠지만 이것이 도움이 되는지 살펴보겠습니다.

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에 대해 실패합니다.아래 방법은 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)));
    }
}

많은 유형(integer, double, DateTime 등)에 대해 정적 Parse 메소드가 있습니다.리플렉션을 사용하여 호출할 수 있습니다.

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 해당 개체에 대해.

다음과 같은 구문을 사용할 수도 있습니다. 특성 클래스.이런 방식으로 문자열을 자체 유형의 값으로 변환하는 방법을 아는 매개변수화된 도우미 클래스를 갖게 됩니다.그러면 getter는 다음과 같이 보일 수 있습니다.

get { return StringConverter<DataType>.FromString(base.Value); }

이제 매개변수화된 유형에 대한 내 경험은 C++ 및 해당 템플릿으로 제한되어 있지만 C# 제네릭을 사용하여 동일한 종류의 작업을 수행할 수 있는 방법이 있다고 생각합니다.

정적 확인 Nullable.GetUnderlyingType.- 기본 유형이 null이면 템플릿 매개변수는 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");
}
public class TypedProperty<T> : Property
{
    public T TypedValue
    {
        get { return (T)(object)base.Value; }
        set { base.Value = value.ToString();}
    }
}

객체를 통한 변환을 사용하고 있습니다.조금 더 간단합니다.

나는 lobos 답변을 사용했고 작동합니다.하지만 변환에 문제가 있었습니다. 더블스 문화 설정 때문에요.그래서 나는 추가했다

return (T)Convert.ChangeType(base.Value, typeof(T), CultureInfo.InvariantCulture);

또 다른 변형입니다.Nullable을 처리하고 문자열이 null이고 T가 다음인 상황도 처리합니다. ~ 아니다 null이 가능합니다.

public class TypedProperty<T> : Property where T : IConvertible
{
    public T TypedValue
    {
        get
        {
            if (base.Value == null) return default(T);
            var type = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T);
            return (T)Convert.ChangeType(base.Value, type);
        }
        set { base.Value = value.ToString(); }
    }
}

에서 영감을 받아 단발님의 답변에 따르면 이러한 확장은 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>();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top