我以下列方式使用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 回答
您是否尝试使用
Type.GetMethod
而不是返回MethodInfo
具有Invoke
方法?更多信息:http://msdn.microsoft.com/en-us/library/6hy0h0z1(v=vs.110).aspx另一种选择是使用dynamic
.看起来您已直接使用Customer类型引用程序集,并尝试使用
Assembly.LoadFile
动态加载它 . 我会尝试做这样的事情来获得程序集并调用其中的方法:如果您坚持动态加载程序集并引用它,您必须了解程序集绑定上下文,否则您将继续遇到同样的问题 .
程序集绑定上下文是独立的内存中程序集高速缓存 .
Load
("default"),LoadFrom
和LoadFile
都使用不同的上下文 . 运行时认为在不同上下文中加载的相同程序集中的相同类型是不同的 . 加载引用的程序集时,它将绑定在默认的"Load"上下文中 .另一种选择可能是使用
Assembly.Load
并提供程序集名称 . 如果程序集是强命名的,则另一个选项可能是之前的Load
然后再使用LoadFrom
,因为LoadFrom
将检查在从指定文件加载之前是否已将具有相同名称的程序集加载到Load
上下文中 .