76

シリアル化された値と型を格納するクラスがあります。すでにキャストされた値を返すプロパティ/メソッドが必要です。

public String Value { get; set; }

public Type TheType { get; set; }

public typeof(TheType) CastedValue { get { return Convert.ChangeType(Value, typeof(_Type)); }

これはC#で可能ですか?

4

3 に答える 3

110

プロパティを含むクラスがジェネリックであり、ジェネリック パラメーターを使用してプロパティを宣言する場合に可能です。

class Foo<TValue> {
    public string Value { get; set; }
    public TValue TypedValue {
        get {
            return (TValue)Convert.ChangeType(Value, typeof(TValue));
        }
    }
}

別の方法は、代わりにジェネリック メソッドを使用することです。

class Foo {
    public string Value { get; set; }
    public Type TheType { get; set; }

    public T CastValue<T>() {
         return (T)Convert.ChangeType(Value, typeof(T));
    }
}

System.ComponentModel.TypeConverterクラスで独自のコンバーターを定義できるため、クラスを使用して変換することもできます。

編集:ジェネリックメソッドを呼び出すときは、コンパイラがそれを推測する方法がないため、ジェネリック型パラメーターを指定する必要があることに注意してください。

Foo foo = new Foo();
foo.Value = "100";
foo.Type = typeof(int);

int c = foo.CastValue<int>();

コンパイル時に型を知っている必要があります。コンパイル時にタイプがわからない場合は、それを に格納する必要があります。その場合、次のプロパティをクラスobjectに追加できます。Foo

public object ConvertedValue {
    get {
        return Convert.ChangeType(Value, Type);
    }
}
于 2008-11-07T06:04:26.040 に答える
60

プロパティ、イベント、コンストラクターなどをジェネリックにすることはできません。メソッドと型のみをジェネリックにすることができます。ほとんどの場合、それは問題ではありませんが、時にはそれが苦痛になることにも同意します。ブラノンの答えは、2 つの合理的な回避策を提供します。

于 2008-11-07T06:25:33.580 に答える
5

あなたがここで挙げた例が可能だとは思いません。CastedValue の型はコンパイル時に定義する必要があります。つまり、実行時の値 (TheType プロパティの値) に依存することはできません。

編集: ブラノンのソリューションには、プロパティではなくジェネリック関数を使用してこれを処理する方法についていくつかの良いアイデアがあります。

于 2008-11-07T06:05:05.397 に答える