-2

さまざまな型 (通常は列挙型) に変換したい文字列があります。これを保持するクラスはジェネリック型であるため、型を保存しても動的に変換する方法が見つかりませんでした

                if(type.IsEnum)
                     typedValue = Enum.Parse(type, value , true);
                }
                else
                {
                    typedValue = Convert.ChangeType(value,type);
                }

                foreach (Delegate method in pair.Value)
                {

                    method.DynamicInvoke(new[] { value, typedValue, time });
                }'

型付きの値を型保存ではなく、型に応じたジェネリック型に変更する必要があります

4

2 に答える 2

0

コンパイル時にのみ型がわかっている場合はジェネリックが使用されるため、これを行うことはできません。この例では、type変数はランタイムタイプを表します。

于 2013-02-17T15:21:10.057 に答える
0

Typeでジェネリック引数を取得できますtypeof

public T Convert<T>(T value)
{
    Type type = typeof(T);
    if(type.IsEnum)
        return (T)Enum.Parse(type, value , true);
    } else {
        ...
    }
}

もちろん、クラスのジェネリック引数を使用してこれを行うこともできます。ただし、いずれにせよ、コンパイル時に型を知る必要があります。タイプ セーフは、コンパイラ チェックに基づいています。コンパイル時に型がわからない場合は、関連するすべての型に共通するより具体的な型がない限り、objectまたは を返す必要があります。dynamic


正しい型を完全に動的に返すメソッドを作成できたと仮定しましょう。

var converted = Convert(type, value);

// Are you allowed to do this?
converted = 2 * converted;

// or this?
converted = converted + " hello";

// or even this?
converted.SaveAs("C:\Data\Converted.txt");

呼び出し元はコンパイル時 (または設計時) に型がわからないため、この型を適切な方法で使用することができません。これは論理的な制限であり、言語の制限ではありません。動的言語や C-Sharp のdynamic型を使用する場合でも、設計時に使用している型について知っておく必要があります。

于 2013-02-17T15:32:01.860 に答える