C# 将动态强制转换为泛型类型
我正在尝试获取对象的C# 将动态强制转换为泛型类型,c#,generics,dynamic,casting,C#,Generics,Dynamic,Casting,我正在尝试获取对象的Cases.Values属性。问题是我无法在运行时将Activity对象强制转换为Switch类型(它从中派生) 当调试器显示该属性不为真时,引发一个错误,即该属性不存在。T与我无关-我只需要Cases集合 编辑 事实上,我找到了比我设定的答案更干净的解决方案 dynamic switchStatement = activity; var cases = switchStatement.Cases as IEnumerable; if (cases != null) {
Cases.Values
属性。问题是我无法在运行时将Activity
对象强制转换为Switch
类型(它从中派生)
当调试器显示该属性不为真时,引发一个错误,即该属性不存在。T
与我无关-我只需要Cases
集合
编辑
事实上,我找到了比我设定的答案更干净的解决方案
dynamic switchStatement = activity;
var cases = switchStatement.Cases as IEnumerable;
if (cases != null)
{
foreach (dynamic aCase in cases)
{
ProcessActivity(aCase.Value);
}
}
你不能
但不是你的循环,而是放:
var process = typeof(CurrentHelperClass).GetMethod("ProcessSwitch`1").MakeGenericMethod(typeof(genericArgumentTypes[0]));
process.Invoke(null,new object[]{activity});
并在同一类中定义一个新方法:
static void ProcessSwitch<T>(Switch<T> switchStatement)
{
foreach (var aCase in switchStatement.Cases.Values)
{
ProcessActivity(aCase, dataSets, context);
}
}
static void ProcessSwitch(Switch Switch语句)
{
foreach(switchStatement.Cases.Values中的var aCase)
{
ProcessActivity(aCase、数据集、上下文);
}
}
var switchType=activity.GetType();
var prop=switchType.GetProperty(“Cases”,System.Reflection.BindingFlags.Public)
|System.Reflection.BindingFlags.Instance)//将它移到方法之外,并在每次调用该方法时使用相同的属性,因为它的性能是可扩展的。
bool-isSwitch=(switchType.IsGenericType&&switchType.GetGenericTypeDefinition()==typeof(开关));
如果(i开关)
{
IEnumerable dictionary=prop.GetValue(activity,null)作为IDictionary;
foreach(dictionary.Values中的变量项)
{
ProcessActivity(项目、数据集、上下文);
}
}
如何定义变量活动
<代码>开关继承自活动
类。开关是System.Activities命名空间的一部分。我怎样才能强制库类实现接口?哦,对了,我没有意识到这一点。你自己在举例说明这个类吗?如果是,您可以定义一个类MySwitch:Switch,ISwitch。如果否,我将提出一个新的答案(稍微复杂一点)否。开关
是工作流中的一个节点。我正在查看其中的每个节点(活动),无法修改所使用的活动类型。是否可以在静态方法中执行此操作?:)因为我基本上是在助手类中使用它。@Tarec实际上它不应该是“ProcessSwitch1”,问题是
GetMethod`默认情况下只查找公共方法。使用GetMethod(“ProcessSwitch”,BindingFlags.NonPublic | BindingFlags.Static)
。我认为这是最干净的解决方案,因为动态查找仅限于您自己的类。谢谢。但是,我发现不能对ContainsGenericParameters为true的类型或方法执行后期绑定操作。字典对象赋值异常。已编辑,现在可以工作了。您只需要对使用GetType()
dynamically获得的属性执行GetValue()
方法。幸运的是,如果将GetValue强制转换为IDictionary
,则返回null。如果我不强制转换它并将其用作动态对象,我将获得dictionary对象,但再次-我将无法获得值
属性。Editer使用IEnumerablet重试此对象是keyvaluepair,您可以对其上的GetProperty和GetValue执行相同的操作以获得值
var process = typeof(CurrentHelperClass).GetMethod("ProcessSwitch`1").MakeGenericMethod(typeof(genericArgumentTypes[0]));
process.Invoke(null,new object[]{activity});
static void ProcessSwitch<T>(Switch<T> switchStatement)
{
foreach (var aCase in switchStatement.Cases.Values)
{
ProcessActivity(aCase, dataSets, context);
}
}
var switchType = activity.GetType();
var prop = switchType.GetProperty("Cases", System.Reflection.BindingFlags.Public
| System.Reflection.BindingFlags.Instance); //move it outside of the method and use the same property for every time you call the method since it's performance expansive.
bool isSwitch = (switchType.IsGenericType && switchType.GetGenericTypeDefinition() == typeof(Switch<>));
if (isSwitch)
{
IEnumerable dictionary = prop.GetValue(activity,null) as IDictionary;
foreach (var item in dictionary.Values)
{
ProcessActivity(item, dataSets, context);
}
}