我可以从参数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);
答案 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) });