Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将动态强制转换为泛型类型_C#_Generics_Dynamic_Casting - Fatal编程技术网

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实际上它不应该是“ProcessSwitch
1”,问题是
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);
        }
}