Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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#/.NET4中生成泛型委托的类型?_C#_Generics_Reflection_Delegates - Fatal编程技术网

如何在C#/.NET4中生成泛型委托的类型?

如何在C#/.NET4中生成泛型委托的类型?,c#,generics,reflection,delegates,C#,Generics,Reflection,Delegates,我可以在运行时从参数System.type列表中创建委托类型,这要感谢这里对一个问题的回答 但是,当其中一个参数是泛型参数时,比如说它代表以下内容,我该如何做呢 delegate t ScanFun<t>(); delegate t ScanFun(); 我需要一个代表泛型委托的System.Type,这样我就可以使用泛型参数t的类型调用Type.MakeGenericType方法。然而,我甚至找不到一种方法来找出它的类型 这是在代码分析工具中使用的。这是我的代码,它适用

我可以在运行时从参数System.type列表中创建委托类型,这要感谢这里对一个问题的回答

但是,当其中一个参数是泛型参数时,比如说它代表以下内容,我该如何做呢

    delegate t ScanFun<t>();
delegate t ScanFun();
我需要一个代表泛型委托的System.Type,这样我就可以使用泛型参数t的类型调用Type.MakeGenericType方法。然而,我甚至找不到一种方法来找出它的类型

这是在代码分析工具中使用的。这是我的代码,它适用于已知类型:

System.Type[] parms = new Type[f.sig.Parms.list.Length + 1];
specs[0] = f.sig.ReturnType.Type;
for (int i = 0; i < f.sig.Parms.list.Length; i++)
    specs[i + 1] = f.sig.Parms.list[i].Type;
for (int i = 0; i < parmTypes_.Length; i++)
{
    if (f.sig.Generic.List.Contains(specs[i].Name))
    {
        /// TODO: Make generic parameter Type here
        goto done;
    }
    parms[i] = f.Parent.findType(specs[i]);
    done: ;
}
var dtype = System.Linq.Expressions.Expression.GetDelegateType(parms);
System.Type[]parms=新类型[f.sig.parms.list.Length+1];
规格[0]=f.sig.ReturnType.Type;
for(int i=0;i
Type openScanFunType=typeof(ScanFun);
Type closedScanFunType=openscanfontype.MakeGenericType(new[]{typeof(int)});
或者(如果有多个类型参数,效果更好):

Type openScanFunType=typeof(ScanFun).GetGenericTypeDefinition();
类型cloCsedScanFunType=openScanFunType.MakeGenericType(新[]{typeof(int)});

这很有意思,但这取决于是否已经有了委托类型。@科林:从您的问题和您的评论中都不清楚此评论究竟是哪一个答复,这正是您当时想要的。我已经从一个文件中解析了委托定义。由此我需要创建一个System.Type来反映这一点。所以我只有返回类型和paramater类型,这是可以实现的,但是当一个或多个参数是泛型参数时,我不知道如何实现。(抱歉,按return to send功能使我的评论有点过早)简而言之,我需要这个系统的功能。Linq.Expressions.Expression.GetDelegateType(Type[]);添加了将任何参数指定为通用参数的功能。
Type openScanFunType = typeof(ScanFun<>);
Type closedScanFunType = openScanFunType.MakeGenericType(new[] { typeof(int) });
Type openScanFunType = typeof(ScanFun<string>).GetGenericTypeDefinition();
Type cloCsedScanFunType = openScanFunType.MakeGenericType(new[] { typeof(int) });