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に行き、デフォルトのケースを実行します..問題は私が何が欠けているかです?