首页 文章

如何使用C#中的Reflection调用将输入参数作为另一个类对象的方法?(方法给出参数异常)

提问于
浏览
1

我以下列方式使用Reflection:a)加载程序集b)获取所有方法及其各自的参数c)调用方法

在调用将输入类型作为原始数据类型(int,double,string等)的方法时,没有遇到的问题我尝试以两种方式调用该方法:

(object)method.Invoke(obj,respar);

其中respar是一个输入参数数组

object cu = Activator.CreateInstance(typeof(Customer)) as Customer;
respar.SetValue(cu, i);//i = index

(object)type.InvokeMember(methodName, BindingFlags.InvokeMethod | BindingFlags.Instance |  BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Default,null, obj, respar);

哪里

object obj = Activator.CreateInstance(type,true);//obj

在第一种情况下,我得到一个参数异常错误,在第二种情况下,我得到方法未找到异常 .

例如,如果我调用一个方法,说Customer(客户数据),其中Customer是一个类,则抛出上述错误 .

让我详细解释:有一个类CustomerModel

public class CustomerModel
   {
        public string FirstName{get;set;}
        public string LastName {get;set;}
   }

和客户类

public class Customer
    {
       public CustomerModel GetCustomerDetails(CustomerTable tableobj)
       {

         //TODO: Get customer details from tableobj and pass to CustomerModel Obj


       }

    }

我试图通过反思调用此客户类的所有方法 . 还有另一个类测试:

public class Test
    {
       public void GetAllMethodsInassembly()
       {

          //Load assembly
          //Get all classes
          // Foreach Class=> get all methods
          //Invoke each method => get result and store in XML file
       }
    }

Customer GetCustomerDetails中的方法,如上所述抛出异常 . 请建议 .

2 回答

  • 0

    您是否尝试使用 Type.GetMethod 而不是返回 MethodInfo 具有 Invoke 方法?更多信息:http://msdn.microsoft.com/en-us/library/6hy0h0z1(v=vs.110).aspx另一种选择是使用 dynamic .

  • 0

    看起来您已直接使用Customer类型引用程序集,并尝试使用 Assembly.LoadFile 动态加载它 . 我会尝试做这样的事情来获得程序集并调用其中的方法:

    Assembly asm = typeof(Customer).Assembly;
    foreach (Type type in asm.GetTypes()) 
    { 
        if (type.IsClass) 
        { 
            MethodInfo method = type.GetMethod(methodName);
            // TODO: create obj
            // TODO: create respar
            method.Invoke(obj, respar);
        }
    }
    

    如果您坚持动态加载程序集并引用它,您必须了解程序集绑定上下文,否则您将继续遇到同样的问题 .

    程序集绑定上下文是独立的内存中程序集高速缓存 . Load ("default"), LoadFromLoadFile 都使用不同的上下文 . 运行时认为在不同上下文中加载的相同程序集中的相同类型是不同的 . 加载引用的程序集时,它将绑定在默认的"Load"上下文中 .

    另一种选择可能是使用 Assembly.Load 并提供程序集名称 . 如果程序集是强命名的,则另一个选项可能是之前的 Load 然后再使用 LoadFrom ,因为 LoadFrom 将检查在从指定文件加载之前是否已将具有相同名称的程序集加载到 Load 上下文中 .

相关问题