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

たった1行のコード..

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