繁体   English   中英

如何在C#中使用Reflection调用将输入参数作为另一个类对象的方法?

[英]How to invoke a method which takes input parameter as another class object using Reflection in C#?(Method gives argument exception)

我以以下方式使用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 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中的方法抛出异常。 请提出建议。

您是否尝试过使用Type.GetMethod代替它返回具有Invoke方法的MethodInfo 此处的更多信息: http : //msdn.microsoft.com/zh-cn/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均使用不同的上下文。 运行时认为来自不同上下文中加载的同一程序集的相同类型是不同的。 加载引用的程序集时,它将绑定在默认的“加载”上下文中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM