由于这里有一个问题的答案,我可以在运行时从参数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);
Type openScanFunType = typeof(ScanFun<>);
Type closedScanFunType = openScanFunType.MakeGenericType(new[] { typeof(int) });
或者(如果有多个类型参数,效果会更好):
Type openScanFunType = typeof(ScanFun<string>).GetGenericTypeDefinition();
Type cloCsedScanFunType = openScanFunType.MakeGenericType(new[] { typeof(int) });