Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using a generic argument in a generic method parameter created by CodeDOM

Tags:

c#

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.

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:

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?

like image 890
ElfsЯUs Avatar asked Feb 09 '26 21:02

ElfsЯUs


1 Answers

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);
}
like image 160
ElfsЯUs Avatar answered Feb 18 '26 14:02

ElfsЯUs



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!