public class Class2
{
public void e(object _a)
{
object o;
Class3 x;
x=(Class3)o;

Console.WriteLine("转换成功");
}
}
public class Class3
{
public string Name;
public Class3()
{
Name="MyClass";
}
}
//程序入口
class Class1
{
static void Main(string[] args)
{
object[] myarray=new object[1];
myarray[0]=new Class3();
Assembly ass=Assembly.LoadFrom("e:\\Class1.dll");
object oo=ass.CreateInstance("C1.Class2"); Type mytype=ass.GetType("C1.Class2");
MethodInfo mi=mytype.GetMethod("e");
mi.Invoke(oo,myarray);
Console.ReadLine();
}
}我用反射调用Class2的方法e,需要传入一个Class3类型的对象,我试了很多次
1、如果我定义e方法的时候,直接写public void e(object _a),就出现参数不相符错误
2、如果我写成现在这样,public void e(object _a),然后在方法体内强制转换成Class3类型,就出现转换类型错误。请问:在需要传入自定义类型的对象的时候,应该如何处理?

解决方案 »

  1.   

    你这个方法怎么是那样的呢?
    是不是抄错了
    public void e(object _a)
    {
    object o;//o怎么没值,会不会是o=_a
    Class3 x;
    x=(Class3)o;

    Console.WriteLine("转换成功");
    }
    还有你的主程序改一下:
    static void Main(string[] args)
    {
    object[] myarray=new object[]{(object)(new Class3())};//因为你的方法e参数是object的,C#是强类型语言,不会自动帮你转化
    Assembly ass=Assembly.LoadFrom("e:\\Class1.dll");
    object oo=ass.CreateInstance("C1.Class2"); Type mytype=ass.GetType("C1.Class2");
    MethodInfo mi=mytype.GetMethod("e");
    mi.Invoke(oo,myarray);
    Console.ReadLine();
    }
      

  2.   

    sorry,我的程序原先很多代码,我贴上来的时候删除了很多无关的,一时没注意,留下错误了。object o;//o怎么没值,会不会是o=_a
    这里的确应该是o=_a至于把Class3的对象强制转化成object类型,我试了一下,不强制转化也没出错。不过我以后会注意的。不过参数传递的问题还是老样子。我试了一下,如果方法e接收的是framework类库里的类,这样传入类的对象作为参数都不出错。但如果传入的是自定义类的对象,就总是出错。究竟是为什么么呢?
      

  3.   

    o=_a
    的确需要.
    另外
    Assembly ass=Assembly.LoadFrom("e:\\Class1.dll");
    //Class1.dll是什么?应该改为你这个程序输出的.exe文件
    Type mytype=ass.GetType("C1.Class2");要改为
    Type mytype =oo.GetType();
    修改后经测试成功..LZ试试
      

  4.   

    这是我测试成功的代码:
    namespace ConsoleApp
    {
    class Class1
    {
    [STAThread]
    static void Main(string[] args)
    {
    object[] myarray=new object[1];
    myarray[0]=new Class3();
    //你把字符串改为你的项目生成文件
    Assembly ass=Assembly.LoadFrom(@"E:\Developer\Panpipe\ConsoleApp\bin\Debug\ConsoleApp.exe");
    object oo=ass.CreateInstance("ConsoleApp.Class2");//此符串改为你的,c1.Class2
    Type mytype =oo.GetType();//此处你要修改为这样
    MethodInfo mi=mytype.GetMethod("e");
    mi.Invoke(oo,myarray);
    Console.ReadLine();
    }
    }
    public class Class2
    {
    public void e(object _a)
    {
    object o=_a;//添加
    Class3 x;
    x=(Class3)o;

    Console.WriteLine("转换成功");
    }
    }
    public class Class3
    {
    public string Name;
    public Class3()
    {
    Name="MyClass";
    }
    }
    }
    有问题速回复,并发个短消息
      

  5.   

    我把代码copy 过来,稍微改了一下,运行后还是老问题。你用的.net是什么版本,我用的是.net 2003
      

  6.   

    我刚才debug 了一下你的代码,不知道为什么,在执行mi.Invoke(oo,myarray);的时候,程序去执行了Class2的代码。
    可是按道理,Class1是不知道Class2的代码,我的class1.dll文件就是把class2.cs和class3.cs打包编译的dll文件。
      

  7.   

    如果你要取得dll文件的assembly的话.
    将Assembly ass=Assembly.LoadFrom(@"E:\Developer\Panpipe\ConsoleApp\bin\Debug\ConsoleApp.exe");改为 Assembly ass=typeof(Class2).Assembly;
    另外object oo=ass.CreateInstance("ConsoleApp.Class2");//此符串要对你的DLL中类的相应名空间和类名,你的应该是c1.Class2吧
      

  8.   

    object oo=ass.CreateInstance("C1.Class2");Type mytype=ass.GetType("C1.Class2");toobject oo=ass.CreateInstance("C1.Class2");Type mytype=oo.GetType("C1.Class2");
      

  9.   

    hoho,问题解决了,非常感谢 Cnapollo(旁痞),非常感谢他耐心地回答我的问题