34

どうすればこれを機能させることができますか?

switch(property.PropertyType){
    case typeof(Boolean): 
        //doStuff
        break;
    case typeof(String): 
        //doOtherStuff
        break;
    default: break;
}

タイプの文字列比較はひどいものであり、変更される可能性があるため、名前を使用したくありません。

4

10 に答える 10

63
        System.Type propertyType = typeof(Boolean);
        System.TypeCode typeCode = Type.GetTypeCode(propertyType);
        switch (typeCode)
        {
            case TypeCode.Boolean:
                //doStuff
                break;
            case TypeCode.String:
                //doOtherStuff
                break;
            default: break;
        }

typeof を使用する場合は、動的な TypeCode.Object に対してハイブリッド アプローチを使用できます。最初の部分 (スイッチ) については、コンパイラがルックアップ テーブルに基づいて決定できるため、これは非常に高速です。

于 2008-09-18T10:54:29.400 に答える
3

できません。できることは、辞書を使用してタイプとデリゲートの間のマッピングを作成することです。

var TypeMapping = new Dictionary<Type, Action<string>>(){
    {typeof(string), (x)=>Console.WriteLine("string")},
    {typeof(bool), (x)=>Console.WriteLine("bool")}
};



string s = "my string";

TypeMapping[s.GetType()]("foo");
TypeMapping[true.GetType()]("true");
于 2008-09-18T10:57:33.573 に答える
2

ここで探しているのは良いマップだと思います。デリゲートとジェネリック IDictionary を使用すると、必要なことを行うことができます。

次のようなことを試してください:

private delegate object MyDelegate();

private IDictionary<Type, MyDelegate> functionMap = new IDictionary<Type, MyDelegate>();

public Init()
{
  functionMap.Add(typeof(String), someFunction);
  functionMap.Add(tyepof(Boolean), someOtherFunction);
}

public T doStuff<T>(Type someType)
{
   return (T)functionMap[someType]();
}
于 2008-09-18T10:58:22.683 に答える
0

スイッチ内で文字列を使用することについて心配する必要はありません。複数の文字列がある場合、コンパイラは自動的にそれをハッシュ ルックアップに変換し、非常に恐ろしいように見えますが、まともなパフォーマンスを提供します。

型文字列の変更の問題は、それを自分で明示的なハッシュ ルックアップにし、静的コンストラクターにハッシュの内容を設定することで解決できます。そうすれば、実行時にハッシュに正しい文字列が入力されるため、正しいままになります。

于 2008-09-18T10:53:21.853 に答える
0

ケースは一定でなければならないため、C#のスイッチでこれを行うことはできません。

何が問題なのですか:

if(property.PropertyType == typeof(bool)) {
    //dostuff;
}
else if (property.PropertyType == typeof(string)) {
    //do other stuff;
}
于 2008-09-18T10:53:31.820 に答える
0

私は最近、似たようなことをしなければならず、スイッチの使用はオプションではありませんでした。typeof(x) で == を実行しても問題ありませんが、よりエレガントな方法は次のようにすることです。

if(property.PropertyType is bool){
  //dostuff;
}
else if (property.PropertyType is string){
    //do other stuff;
}

しかし、「is」キーワードをこのように使用できるかどうかはわかりません。オブジェクトに対してのみ機能すると思います...

于 2008-09-18T10:58:16.583 に答える
0

stringmatching について: stringmatching を使用しないことが質問の要件の 1 つでした。

ディクショナリは、このシリアル化アルゴリズム全体を独自のライブラリに配置するときに使用するアプローチです。今のところ、私の場合は基本型のみを使用するため、最初に typeCode を試します。それがうまくいかない場合は、if/elses の群れに戻ります:S

ppl がなぜ自分のシリアル化が必要なのかを私に尋ねる前に: 1) .net xml シリアル化はセッターなしでプロパティをシリアル化しません 2) シリアル化はいくつかのレガシールールに準拠する必要があります

于 2008-09-18T11:35:33.513 に答える
-1

私は個人的にこのアプローチを最も好みDictionary<Type, other>ます... 別の例を提供することもできます: http://www.timvw.be/presenting-namevaluecollectionhelper/

switch-case ステートメントを書きたい場合は、Type 名を使用できます...

switch (blah.PropertyType.FullName)
{
   case typeof(int).FullName: break;
   case typeof(string).FullName: break;
}
于 2008-09-18T11:18:37.470 に答える
-1

通常の if/else if/else パターンを使用するだけです:

if (property.PropertyType == typeof(Boolean))
{
} 
else if (property.PropertyType == typeof(String))
{
}
else if (...)
{
}
于 2008-09-18T10:54:08.450 に答える