【发布时间】:2014-02-07 10:40:35
【问题描述】:
我正在尝试访问 System.Activities.Statements.Switch 对象的 Cases.Values 属性。问题是我不能在运行时将 Activity 对象转换为 Switch<> 类型(派生自它)。
var switchType = activity.GetType();
bool isSwitch = (switchType.IsGenericType && switchType.GetGenericTypeDefinition() == typeof(Switch<>));
if (isSwitch)
{
Type[] genericArgumentTypes = switchType.GetGenericArguments();
if (genericArgumentTypes.Length > 0)
{
var switchStatement = (Switch<genericArgumentTypes[0]>) activity; //that's incorrect
foreach (var aCase in switchStatement.Cases.Values)
{
ProcessActivity(aCase, dataSets, context);
}
}
}
还有,
dynamic switchStatement = activity;
foreach (var aCase in switchStatement.Cases.Values)
{
ProcessActivity(aCase, dataSets, context);
}
抛出一个错误,该属性不存在,而调试器显示它不正确。 T 与我无关 - 我只需要 Cases 集合。
编辑
实际上,我找到了比我设置为答案的更清洁的解决方案。
dynamic switchStatement = activity;
var cases = switchStatement.Cases as IEnumerable;
if (cases != null)
{
foreach (dynamic aCase in cases)
{
ProcessActivity(aCase.Value);
}
}
【问题讨论】:
-
变量
activity是如何定义的? -
msdn.microsoft.com/en-us/library/vstudio/…
Switch<>继承自Activity类。
标签: c# generics dynamic casting