简体   繁体   English

在CodeDOM创建的泛型方法参数中使用泛型参数

[英]Using a generic argument in a generic method parameter created by CodeDOM

I am trying to create a generic method through code dome where the generic argument is used in the method parameter, for example: 我试图通过代码圆顶创建一个泛型方法,其中泛型参数用在方法参数中,例如:

String.Join<T>(String, IEnumerable<T>)

I have a bit of code to generate the parameters that looks like this: 我有一些代码来生成如下所示的参数:

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

However this incorrectly generates: 但是这会错误地生成:

string Join<T>(string separator, System.Collections.Generic.IEnumerable<> values)
        ;

Where the T in IEnumerable is missing. 缺少IEnumerable中的T的地方。

I have tried to add the following in order to force add the generic parameters: 我试图添加以下内容以强制添加通用参数:

foreach (var generic in parameterType.GetGenericArguments())
{
    var typeref = new CodeTypeReference(generic, CodeTypeReferenceOptions.GenericTypeParameter);
    memberParameter.Type.TypeArguments.Add(typeref);
}

However, this produces a copy of 1', causing the output code to look like this: 但是,这会产生1'的副本,导致输出代码如下所示:

string Join<T>(string separator, System.Collections.Generic.IEnumerable<T>`1 values)
        ;

Any thoughts on what I might be doing wrong, or how to correctly generate the parameters when using generic arguments? 有关我可能做错了什么的想法,或者在使用泛型参数时如何正确生成参数?

Found a solutions, for next person who gets stock on this: 为下一个获得股票的人找到了解决方案:

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

its only one line code.. 它只有一行代码..

 foreach (var parameter in method.GetParameters())
 {
   memberMethod.Parameters.Add(new CodeParameterDeclarationExpression(parameter.ParameterType.Name, parameter.Name));
 }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM