Простой способ будет:
private ICollection<object> ScanInternal(string path)
{
List<object> result = new List<object>();
MethodInfo GetReports =
_reportFactoryType.GetMethod("GetAllReportsInstalled");
IEnumerable reports = GetReports.Invoke(_reportFactory, null)
as IEnumerable;
if (reports != null) // or exception if null ?
{
foreach (object report in reports)
result.Add(report);
}
return result;
}
Но более подходящим способом было бы создать интерфейс в отдельной общей сборке (например, IReportLocationInfo
), а затем использовать этот интерфейс в обеих сборках.
Подумайте немного о рефакторинге вашего кода, чтобы добиться этого, потому что вызов методов с использованием Reflection для экземпляра object
почти аналогичен выполнению простого C. Вы не получаете безопасность типов.
Таким образом, способ ООП состоит в том, чтобы все интерфейсы были в отдельной сборке (на которую ссылаются программа A и программа B):
public interface IReportFactory
{
IEnumerable<IReportLocationInfo> GetAllReportsInstalled();
}
public interface IReportLocationInfo
{
void SomeMethod();
}
А затем внедрите ваши бетонные заводы в «подключаемые» сборки ( программа A ):
public class MyReportFactory : IReportFactory
{
// ...
}
А затем приведите каждый плагин к IReportFactory
после загрузки внутри программы B .