如何在C#/ .NET 4中创建泛型委托的类型?

时间:2011-06-28 01:35:47

标签: c# generics reflection delegates

我可以从参数System.Type列表中在运行时创建委托类型,这要归功于这里的问题答案。

但是,当其中一个参数是通用参数时,我该怎么做呢,比方说它代表如下?

    delegate t ScanFun<t>();

我想要一个表示泛型委托的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);

1 个答案:

答案 0 :(得分:2)

Type openScanFunType = typeof(ScanFun<>);
Type closedScanFunType = openScanFunType.MakeGenericType(new[] { typeof(int) });

或者(如果有多个类型参数,这会更好):

Type openScanFunType = typeof(ScanFun<string>).GetGenericTypeDefinition();
Type cloCsedScanFunType = openScanFunType.MakeGenericType(new[] { typeof(int) });