如何调用一个方法,其中输入参数作为另一个类对象使用反射在c# ?(方法给出参数异常)



我以以下方式使用反射: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 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

       }
    }

我试图通过反射调用这个客户类的所有方法。还有一个类Test:

    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中的方法,该方法抛出了如上所述的异常。请建议。

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

看起来您已经直接使用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上下文中,然后从指定的文件加载它。

最新更新