سؤال

لدي الدرجة التي أريد استخدامها لتخزين "خصائص" عن فئة أخرى.هذه الخصائص يكون مجرد اسم و قيمة.من الناحية المثالية, ما أود أن تكون قادرة على إضافة كتبته خصائص ، حتى أن "قيمة" عاد هو دائما من النوع الذي أريد لها أن تكون.

يجب أن يكون النوع دائما البدائية.هذه فئة فرعية فئة مجردة الأساس الذي يقوم بتخزين اسم قيمة السلسلة.والفكرة هي أن هذا سوف فرعية إضافة نوع-السلامة إلى الفئة الأساسية (فضلا عن توفير لي على بعض التحويل).

لذلك أنا خلقت طبقة (تقريبا) هذا:

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

نصائح أخرى

لوبوس hasko هذا الأسلوب فشل nullables.الأسلوب أدناه سوف تعمل nullables.لم تأتي معها ، على الرغم من.لقد وجدت أنه عبر جوجل: http://web.archive.org/web/20101214042641/http://dogaoztuzun.com/post/C-Generic-Type-Conversion.aspx الائتمان "التونة 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, التاريخ والوقت الخ), وهناك تحليل ثابتة الأسلوب.يمكنك استدعاء باستخدام التفكير:

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 هذا الكائن المحدد.

يمكن استخدام بناء مثل الصفات الدرجة.في هذه الطريقة, سيكون لديك parameterised مساعد الدرجة التي يعرف كيفية تحويل سلسلة إلى قيمة من نوع خاص بها.ثم جالبة قد تبدو مثل هذا:

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

الآن, يجب أن أشير إلى أن تجربتي مع parameterised أنواع يقتصر على C++ و القوالب, ولكن أتصور أن هناك وسيلة للقيام نفس الشيء باستخدام C# الوراثة.

تحقق ثابت Nullable.GetUnderlyingType.- إذا الأساسية نوع null, ثم القالب المعلمة ليست Nullable, و يمكننا استخدام هذا النوع مباشرة - إذا الأساسية نوع ليست فارغة, ثم استخدام الأساسية اكتب في التحويل.

يبدو أن العمل بالنسبة لي:

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

أنا باستخدام تحويل عن طريق كائن.فمن قليلا أكثر بساطة.

اعتدت لوبوس الجواب وأنه يعمل.ولكن لدي مشكلة مع تحويل الزوجي لأن ثقافة الإعدادات.لذلك أضفت

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

بعد اختلاف آخر.مقابض Nullables ، وكذلك الحالات التي تكون فيها سلسلة فارغة و T هو لا nullable.

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

مع الإلهام من بوب's الجواب هذه الملحقات أيضا دعم قيمة فارغة تحويل جميع بدائية التحويل مرة أخرى و الرابع.

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