264

別のクラスの「プロパティ」を格納するために使用したいクラスがあります。これらのプロパティには、単に名前と値があります。理想的には、型指定されたプロパティを追加できるようにして、返される「値」が常に希望する型になるようにすることです。

型は常にプリミティブでなければなりません。このクラスは、基本的に名前と値を文字列として格納する抽象クラスをサブクラス化します。このサブクラスは、基本クラスにいくつかの型安全性を追加するという考えです (また、いくつかの変換で私を節約します)。

だから、私は(おおよそ)これであるクラスを作成しました:

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

質問は次のとおりです。

文字列からプリミティブに戻す「一般的な」方法はありますか?

全体的に変換をリンクする一般的なインターフェイスを見つけることができないようです ( ITryParsableのようなものが理想的でした!)。

4

11 に答える 11

422

あなたの意図を正しく理解したかどうかはわかりませんが、これが役立つかどうか見てみましょう.

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();}
    }
}
于 2008-08-12T09:24:33.203 に答える
82

luboshaskoのメソッドはnullableに対して失敗します。以下の方法は、nullableに対して機能します。しかし、私はそれを思いつきませんでした。Googleで見つけました:http: //web.archive.org/web/20101214042641/http : //dogaoztuzun.com/post/C-Generic-Type-Conversion.aspx「TunaToksoz」のクレジット

最初の使用法:

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)));
    }
}
于 2009-12-02T14:11:47.603 に答える
20

多くの型 (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 });
}
于 2008-08-12T09:32:06.480 に答える
12
TypeDescriptor.GetConverter(PropertyObject).ConvertFrom(Value)

TypeDescriptorGetConvertorオブジェクトを受け入れるメソッドを持つクラスであり、メソッドをType呼び出して、その指定されたオブジェクトConvertFromを変換できます。value

于 2013-07-09T11:26:13.877 に答える
4

traits classなどの構成を使用できる可能性があります。このようにして、文字列を独自の型の値に変換する方法を知っているパラメーター化されたヘルパー クラスができます。次に、ゲッターは次のようになります。

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

ここで、パラメーター化された型に関する私の経験は C++ とそのテンプレートに限定されていることを指摘しなければなりませんが、C# ジェネリックを使用して同じようなことを行う方法があると思います。

于 2008-08-12T09:23:51.737 に答える
4

静的を確認してください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");
}
于 2015-08-07T17:53:00.530 に答える
0

ロボスの回答を使用しましたが、機能します。しかし、カルチャ設定が原因で、doubleの変換に問題がありました。だから私は追加しました

return (T)Convert.ChangeType(base.Value, typeof(T), CultureInfo.InvariantCulture);
于 2015-06-03T07:53:13.430 に答える
0
public class TypedProperty<T> : Property
{
    public T TypedValue
    {
        get { return (T)(object)base.Value; }
        set { base.Value = value.ToString();}
    }
}

オブジェクトを介した変換を使用しています。少しシンプルです。

于 2010-12-17T14:51:24.167 に答える
0

さらに別のバリエーション。Nullables だけでなく、文字列が null で 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(); }
    }
}
于 2017-08-07T21:26:54.250 に答える