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

时间:2014-06-20 06:27:04

标签: c# reflection invokemember

我以下列方式使用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

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

例如,如果我调用一个方法说GetCustomer(客户数据),其中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 :(得分:0)

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

答案 1 :(得分: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(“默认”),LoadFromLoadFile都使用不同的上下文。运行时认为在不同上下文中加载的相同程序集中的相同类型是不同的。加载引用的程序集时,它将绑定在默认的“Load”上下文中。

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