MethodBuilder.DefineParameter无法设置参数名称的原因?

时间:2010-02-02 11:15:25

标签: .net reflection .net-3.5 reflection.emit

我正在为WCF问题创建一个基于现有接口的接口,但我没有设置参数名称的“DefineParameter”(创建类型的方法参数没有名称)。
你能看出原因吗?

    public static Type MakeWcfInterface(Type iService)
    {
        AssemblyName assemblyName = new AssemblyName(String.Format("{0}_DynamicWcf", iService.FullName));
        String moduleName = String.Format("{0}.dll", assemblyName.Name);
        String ns = iService.Namespace;
        if (!String.IsNullOrEmpty(ns)) ns += ".";

        // Create assembly
        var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);

        // Create module
        var module = assembly.DefineDynamicModule(moduleName, false);

        // Create asynchronous interface type
        TypeBuilder iWcfService = module.DefineType(
            String.Format("{0}DynamicWcf", iService.FullName),
            TypeAttributes.Public | TypeAttributes.Interface | TypeAttributes.Abstract
            );

        // Set ServiceContract attributes
        iWcfService.SetCustomAttribute(ReflectionEmitHelper.BuildAttribute<ServiceContractAttribute>(null,
            new Dictionary<string, object>() { 
                { "Name", iService.Name },
                }));

        iWcfService.SetCustomAttribute(ReflectionEmitHelper.BuildAttribute<ServiceBehaviorAttribute>(null,
            new Dictionary<string, object>() {
                    { "InstanceContextMode" , InstanceContextMode.Single }
                })
        );

        foreach (var method in iService.GetMethods())
        {
            BuildWcfMethod(iWcfService, method);
        }

        return iWcfService.CreateType();
    }


    private static MethodBuilder BuildWcfMethod(TypeBuilder target, MethodInfo template)
    {
        // Define method
        var method = target.DefineMethod(
            template.Name,
            MethodAttributes.Abstract | MethodAttributes.Virtual
             | MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.VtableLayoutMask | MethodAttributes.HideBySig,
            CallingConventions.Standard, 
            template.ReturnType,
            template.GetParameters().Select(p => p.ParameterType).ToArray()
            );

        // Define parameters
        foreach (ParameterInfo param in template.GetParameters())
        {
            method.DefineParameter(param.Position, ParameterAttributes.None, param.Name);
        }

        // Set OperationContract attribute
        method.SetCustomAttribute(ReflectionEmitHelper.BuildAttribute<OperationContractAttribute>(null, null));

        return method;
    }

1 个答案:

答案 0 :(得分:11)

我明白了,所以我让你知道 答案与我使用DefineParameter函数的方式有关 GetParameters函数返回有关所提供方法的参数的信息 但是DefineParameter函数为所有参数设置参数信息(包括返回参数),因此位置移位:使用DefineParameter,位置0引用返回参数,调用参数从位置1开始。

请参阅修复:

method.DefineParameter(param.Position+1, ParameterAttributes.None, param.Name);

STFM(参见fu ....手册):

MethodBuilder.DefineParameter Method @ MSDN

干杯:)