3

我正在尝试通过代码圆顶创建一个通用方法,其中在方法参数中使用了通用参数,例如:

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)
        ;

关于我可能做错了什么,或者在使用泛型参数时如何正确生成参数的任何想法?

4

2 回答 2

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);
}
于 2013-05-10T19:07:16.513 回答
0

它只有一行代码..

 foreach (var parameter in method.GetParameters())
 {
   memberMethod.Parameters.Add(new CodeParameterDeclarationExpression(parameter.ParameterType.Name, parameter.Name));
 }
于 2015-04-22T06:06:24.783 回答