1

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

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

(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 data),其中 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 中的方法如前所述抛出异常。请建议。

4

2 回答 2

0

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

于 2014-06-20T07:01:28.327 回答
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(“默认”)LoadFrom、 和LoadFile都使用不同的上下文。运行时认为在不同上下文中加载的相同程序集的相同类型是不同的。当一个引用的程序集被加载时,它被绑定在默认的“加载”上下文中。

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

于 2014-06-20T08:35:32.733 回答