-1

http://blogs.msdn.com/b/jaredpar/archive/2008/05/16/switching-on-types.aspxから次のコードを取得しました

static class TypeSwitch {
    public class CaseInfo {
        public bool IsDefault { get; set; }
        public Type Target { get; set; }
        public Action<object> Action { get; set; }
    }

    public static void Do(object source, params CaseInfo[] cases) {
        var type = source.GetType();
        foreach (var entry in cases) {
            if (entry.IsDefault || type == entry.Target) {
                entry.Action(source);
                break;
            }
        }
    }

    public static CaseInfo Case<T>(Action action) {
        return new CaseInfo() {
            Action = x => action(),
            Target = typeof(T)
        };
    }

    public static CaseInfo Case<T>(Action<T> action) {
        return new CaseInfo() {
            Action = (x) => action((T)x),
            Target = typeof(T)
        };
    }

    public static CaseInfo Default(Action action) {
        return new CaseInfo() {
            Action = x => action(),
            IsDefault = true
        };
    }
}

そして私は次のことをしています

TypeSwitch.Do(
                    p.PropertyType,
                    TypeSwitch.Case<Int32>(() => DoSomething),
                    TypeSwitch.Case<Double>(() => DoSomething),
                    TypeSwitch.Case<float>(() => DoSomething),
                    TypeSwitch.Case<bool>(() => DoSomething),
                    TypeSwitch.Case<String>(() => DoSomething),
                    TypeSwitch.Default(() => {                     
                        TypeSwitch.Do
                            (
                            p.PropertyType,
                            TypeSwitch.Case<Object[]>(() => Do()),
                            TypeSwitch.Case<IEnumerable<Object>>(() => Do()),
                            TypeSwitch.Case<IDictionary<Object, Object>>(() => Do()

                        )
                    );

pはタイプPropertyInfoです。p.PropertyTypeがStringの場合でも、デフォルトのケースになります..なぜですか?壊れてはいけませんか?TypeSwitchに不足しているものがある場合、どうすればそれを修正できますか?

編集

なぜ誰もが私が最初にそれをデバッグしなかったと思い込んで、反対票を投じたのか分かりません。しかし、私はこれにかなりの時間を費やしました。私はチェックしました、私は文字列としてProprtyTypeを渡すだけです、それはすべてのためにCaseInfoをループし、それからそれはDoに行き、デフォルトのケースを実行します..問題は私が何が欠けているかです? ここに画像の説明を入力してください

4

1 に答える 1

3

その理由は、パスしp.PropertyTypeて後で取得source.GetType()するためです。この場合は、に評価されtypeof(Type)ます。

おそらく、Type(とは対照的にobject)最初のパラメーターとしてインスタンスを受け取るオーバーロードを作成する必要があります。

このようなエラーは、デバッガーを使用してコードをステップ実行することで自分で見つけることができます。実際の変数値を期待値と比較します。

于 2012-06-30T19:38:35.650 に答える