我正在尝试通过代码圆顶创建一个泛型方法,其中泛型参数用于方法参数,例如:
String.Join<T>(String, IEnumerable<T>)
我有一些代码来生成如下所示的参数:
foreach (var parameter in method.GetParameters())
{
Type parameterType = parameter.ParameterType;
this.VerifyTypeIsKnown(parameterType, typeSet, parameter.Name, "Parameter");
globalNamespace.Imports.Add(new CodeNamespaceImport(parameterType.Namespace));
var memberParameter = new CodeParameterDeclarationExpression(parameterType, parameter.Name);
memberMethod.Parameters.Add(memberParameter);
}
但是这会错误地生成:
string Join<T>(string separator, System.Collections.Generic.IEnumerable<> values)
;
IEnumerable中的T缺失。
我尝试添加以下内容以强制添加通用参数:
foreach (var generic in parameterType.GetGenericArguments())
{
var typeref = new CodeTypeReference(generic, CodeTypeReferenceOptions.GenericTypeParameter);
memberParameter.Type.TypeArguments.Add(typeref);
}
但是,这会产生1'的副本,导致输出代码如下所示:
string Join<T>(string separator, System.Collections.Generic.IEnumerable<T>`1 values)
;
有关我可能做错了什么的想法,或者在使用泛型参数时如何正确生成参数?
答案 0 :(得分:4)
为下一个获得股票的人找到了解决方案:
foreach (var parameter in method.GetParameters())
{
Type parameterType = parameter.ParameterType;
this.VerifyTypeIsKnown(parameterType, typeSet, parameter.Name, "Parameter");
globalNamespace.Imports.Add(new CodeNamespaceImport(parameterType.Namespace));
var typeArguments = from param in parameterType.GetGenericArguments()
select new CodeTypeReference(param);
var memberParameterType = new CodeTypeReference(parameterType.Name, typeArguments.ToArray<CodeTypeReference>());
var memberParameter = new CodeParameterDeclarationExpression(memberParameterType, parameter.Name);
memberMethod.Parameters.Add(memberParameter);
}
答案 1 :(得分:0)
它只有一行代码..
foreach (var parameter in method.GetParameters())
{
memberMethod.Parameters.Add(new CodeParameterDeclarationExpression(parameter.ParameterType.Name, parameter.Name));
}