Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Access to type T properties of IEnumerable<T> returned from a method called via reflection

I have a .dll and a console app that uses the said .dll but doesn't reference directly, it loads it via reflection. The console app calls a method of a class inside the .dll.
The method signature is IEnumerable<Customer> GetAll();

In the .dll I have done this:

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;
        }
    }
}

In the Console app I've done this:

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);

Now the question is, since GetAll returns IEnumerable<Customer> and my console app doesn't "know" anything about MyDLL.dll (I don't reference it directly, so it doesn't knows the Customer type).

How can I access to the Customer list in order to access Customer'a properties without having to make a reference to the .dll explicitly?

like image 726
favner85 Avatar asked Jul 31 '14 17:07

favner85


2 Answers

You have three options

  1. Move Client or move a interface Client implements to a 3rd dll that both the reflected DLL and your console app can reference.
  2. Use the dynamic keyword as the type of the object (dynamic customerList = methodInfo.Invoke(...), this is the exact situation it was invented for.
  3. Cast the return type as a plain IEnumerable and use reflection calls to call the methods in Client on the object objects the IEnumerable returns.
like image 68
Scott Chamberlain Avatar answered Sep 27 '22 00:09

Scott Chamberlain


As everything is inside the DLL that you load dynamically, the first and fastest thing that comes to mind is to cast the GetAll as an IEnumerable<dynamic> and use the properties accordingly.

like image 24
LazyOfT Avatar answered Sep 26 '22 00:09

LazyOfT