2010-02-02 61 views
1

我正在創建一個基於現有接口WCF關注的接口,但我有「DefineParameter」不設置參數名稱(創建類型的方法參數沒有名稱)。
你能看出原因嗎?MethodBuilder.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; 
    } 

回答

9

我明白了,所以我讓你知道。
答案就像我使用DefineParameter函數一樣。
GetParameters函數返回有關所提供方法的參數的信息。
但對於所有參數(包括返回參數)的DefineParameter功能設置參數信息,讓志願服務崗位轉移:使用DefineParameter,位置0引用返回參數,調用參數在現在的位置開始1

見修復:

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

STFM(見福....手冊):

MethodBuilder.DefineParameter Method @ MSDN

乾杯:)

+0

謝謝,在閱讀手冊時省下了一些時間:) – 2018-03-06 05:37:29

相關問題