Reputation: 1218
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?
Upvotes: 3
Views: 649
Reputation: 59
its only one line code..
foreach (var parameter in method.GetParameters())
{
memberMethod.Parameters.Add(new CodeParameterDeclarationExpression(parameter.ParameterType.Name, parameter.Name));
}
Upvotes: 0
Reputation: 1218
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);
}
Upvotes: 4