none
c#使用反射技术动态执行方法时如何取引用类型参数的值? RRS feed

  • 问题

  • 本人想通过反射技术动态加载dll来执行方法并取引用类型参数的值。下面是我的代码:

    MYService.dll中存在函数GetDataTable  原型:

    public int GetDataTable(string SQLCommand, ref DataTable Result);

    本人想通过反射动态加载MYService.dll,来执行GetDataTable 并获取 DataTable Result 中的ref 返回的值,但我每次执行都返回了空对象?是否应该用指针去做,还是有别的方法?请各位大大指点迷津!!跪谢!

    贴完整代码如下:

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using System.Reflection;
    using System.IO;
    using System.Data;
    using System.Text;
    using System.Data.SqlClient;

    namespace TEST

        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {

                
                Program.INITAPP();

            }

            private static  void INITAPP()
            {
          
                DataTable dt = new DataTable();

                object[] paramArray = new object[] { "select * from xxxx",dt }; //传递的参数
       

            

                Type[] paramTypes = new Type[2];
                paramTypes[0] = Type.GetType("System.String");
                paramTypes[1] = Type.GetType("System.Data.DataTable&,System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");


                try
                {

                    Assembly assm = Assembly.LoadFrom(Application.StartupPath + @"\MYService.dll");
                    Type objType = assm.GetType("com.MYService.TableService",true);
                    object objInstance = Activator.CreateInstance(objType, true);
                  
                    MethodInfo mi = objType.GetMethod(
                        "GetDataTable",
                        BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance,
                        null,
                        paramTypes,
                        null
                        );
                    //返回空对象
                   
                   // MethodInfo mi = objType.GetMethod("GetDataTable",paramTypes);


                    if (mi != null)
                    {
             
               
                        object result = mi.Invoke(objInstance,paramArray);
                        DataTable rs = (DataTable)paramArray[1];//需要取回的结果,但现在老为空,不知道啥原因
                        
                    }

                    
                }
                catch (Exception e)
                {

                    MessageBox.Show(e.Message+"\n\n"+e.StackTrace);
                }
     
            }


        }
    }

    2010年6月23日 6:47

答案

  • 你好,

    根据你的情况我做了个测试,发现结果很正常,没有出现你说的这种情况。

    所以可能是你的内部调用执行这个方法的时候出错了。你检查下你那个方法的代码试试,比如你那个sql语句是否被执行了等。

    我的测试代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Reflection;
    
    namespace ReflectionTest
    {
     class Program
     {
      static void Main(string[] args)
      {
       Type type=typeof(Test);
       object instance=Activator.CreateInstance(type);
       MethodInfo mi = type.GetMethod("AddStr");
       List<string> str = new List<string>();
       object[] parameters = new object[] { str };
       mi.Invoke(instance, parameters);
       foreach (string item in str)
       {
        Console.WriteLine(item);
       }
      }
    
     
     }
    
     public class Test
     {
      public void AddStr(ref List<string> str)
      {
       str.Add("this is a test!");
       
      }
     }
    }
    
    
    

    Microsoft Online Community Support
    2010年6月25日 2:53
  • 在传递参数时,你使用引用类型,这应该是没有问题的。仔细查下代码的。

     


    喻敏华
    2010年6月28日 9:19

全部回复

  • 在线等,谢谢。。。。。。。。
    2010年6月23日 6:52
  • 你好,

    根据你的情况我做了个测试,发现结果很正常,没有出现你说的这种情况。

    所以可能是你的内部调用执行这个方法的时候出错了。你检查下你那个方法的代码试试,比如你那个sql语句是否被执行了等。

    我的测试代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Reflection;
    
    namespace ReflectionTest
    {
     class Program
     {
      static void Main(string[] args)
      {
       Type type=typeof(Test);
       object instance=Activator.CreateInstance(type);
       MethodInfo mi = type.GetMethod("AddStr");
       List<string> str = new List<string>();
       object[] parameters = new object[] { str };
       mi.Invoke(instance, parameters);
       foreach (string item in str)
       {
        Console.WriteLine(item);
       }
      }
    
     
     }
    
     public class Test
     {
      public void AddStr(ref List<string> str)
      {
       str.Add("this is a test!");
       
      }
     }
    }
    
    
    

    Microsoft Online Community Support
    2010年6月25日 2:53
  • 在传递参数时,你使用引用类型,这应该是没有问题的。仔细查下代码的。

     


    喻敏华
    2010年6月28日 9:19