string total="";//存储生成的编号
for(int i=0;i<newTable.Rows.Count;i++)
{
     string name=newTable.Rows[i][2].ToString().Trim();//函数名
     string opl=newTable.Rows[i][3].ToString().Trim();//所传递的参数
if(name!="")
{
myarr.Add(newTable.Rows[i][2].ToString().Trim());
object obj = Activator.CreateInstance(typeof(getbh), true);
getbh he = obj as getbh;
MethodInfo method = he.GetType().GetMethod(name);
if(newTable.Rows[i][3].ToString().Trim()=="")//没有参数
{

string t = (string)method.Invoke(he,null);
total+=t;
}
else 
{
object[] par=new object[]{opl};
string t1 = (string)method.Invoke(he,par);//运行到这句报错:
                 未将对象引用设置到对象的实例。
                  total+=t1;
}
}
}why?

解决方案 »

  1.   

    对象引用是空的
    我感觉是这个getbh he = obj as getbh;
      

  2.   

    obj已经是getbh类的实例了
    he 复制了obj吧
      

  3.   

    没有参数可以运行得到结果
    一旦运行传参数的函数就报错string t1 = (string)method.Invoke(he,par);//运行到这句报错:
      

  4.   

    MethodInfo method = he.GetType().GetMethod(name);
    如果运行到这里
    先判断下he是否为空,因为使用as的关系,可能在转换失败时he为null。在判断name是否为空或者为""。
    最后判断下method 是否为null。。因为这个类里面不一定包含name方法。
    当然还要判断下opl是否为空,并查看具体调用的方法是否可以接受null类型的参数。
    如果4者有1为null,都会可能会出现这个问题。
      

  5.   

    getbh he = obj as new getbh;
      

  6.   

    调试——自己去打印内存变量和调用堆栈,而不是问“why?”。你的问题表现方式太玄了。你应该贴出当前 method 和 he 的命令窗口或者监视窗口打印结果。
      

  7.   

    你需要判断newTable.Rows[i][2],newTable.Rows[i][3]是否为null
      

  8.   

    调用没参数传递的方法可以执行
    但是调用有参数的方法的时候method对象为null
    比如name=_pnum(在dll文件中定义public static string _pnum(string lx))
      

  9.   

    问题已经解决
    dll文件的问题
    谢谢各位的热心帮助