我有一个.dll和一个使用所述.dll的控制台应用程序,但没有直接引用,
它通过反射加载它。控制台应用程序在.dll中调用类的方法
方法签名为IEnumerable<Customer> GetAll()
;
在.dll中我做到了:
class CustomerRepository : ICustomerRepository
{
public IEnumerable<Customer> GetAll()
{
using (var db = new DB02Context())
{
List<Customer> list = new List<Customer>();
// some queries to fill the list
return list;
}
}
}
在控制台应用中,我做到了这一点:
Assembly assembly = Assembly.LoadFrom(pathToMyDLL);
Type t = assembly.GetType("MyDLL.Models.CustomerRepository");
var methodInfo = t.GetMethod("GetAll");
if(methodInfo == null)
throw new Exception("The method doesn't exists");
var customerRepository = Activator.CreateInstance(t);
// Invoke the GetAll() method
var customerList = methodInfo.Invoke(customerRepository, null);
现在问题是,因为GetAll返回IEnumerable<Customer>
和我的控制台应用程序
不知道任何有关MyDLL.dll的内容(我不直接引用它,因此它不知道Customer
类型)。
如何访问Customer列表以访问Customer'a属性而无需明确引用.dll?
答案 0 :(得分:5)
你有三个选择
Client
或将接口Client
工具移动到第3个dll,反映的DLL和控制台应用都可以引用它。dynamic
关键字作为对象的类型(dynamic customerList = methodInfo.Invoke(...
),这是它发明的确切情况。IEnumerable
并使用反射调用来调用Client
object
对象上IEnumerable
返回的对象中的方法。答案 1 :(得分:1)
由于所有内容都在您动态加载的DLL中,因此首先想到的是将GetAll强制转换为IEnumerable<dynamic>
并相应地使用这些属性。
答案 2 :(得分:1)
您永远无法制作通用的IEnumerable&lt;&#39;客户&gt; object,因为运行时无法在编译时静态检查类的属性。
我打算发布关于动态物体的文章,但Brizio打败了我。另一个可能对你有帮助的想法。
您可以创建一个CustomerProxy类(在控制台应用程序中),它公开客户的公共方法,并使用反射调用Customer对象。这样可以为CustomerProxy类的用户进行静态类型检查。
答案 3 :(得分:0)
http://msdn.microsoft.com/en-us/library/vstudio/dd799517(v=vs.100).aspx 或搜索泛型中的协方差和反差异
IEnumerable<Object> customerList = methodInfo.Invoke(customerRepository, null);