Не удалось создать объект с помощью Activator.CreateInstance

Я пытаюсь загрузить старую версию Farpoint DLL в моем проекте с помощью кода ниже

     System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFile(@"FarPoint.Web.Spread.dll");
    System.Type MyDLLFormType = assembly.GetType("FarPoint.Web.Spread.FpSpread");
    var c = Activator.CreateInstance(MyDLLFormType);

Проблема в том, что после создания экземпляра все доступные методы farpoint недоступны [например, если я создаю объект напрямую, методы, такие как saveExcel или savechanges, доступны с экземпляром]

                FpSpread fpProxyObject = new FpSpread();
                fpProxyObject.SaveExcel();

2 ответа

Они доступны, только не во время компиляции. Activator.CreateInstance() возвращает object, Вы, конечно, можете разыграть объект:

var c = Activator.CreateInstance(...)
FpSpread fpProxyObject = (FpSpread)c;

Но это, вероятно, побило бы всю цель использования отражения для создания экземпляра.

Вы можете получить доступ ко всем членам объекта результата, используя отражение, то есть:

MethodInfo saveExcelMethod = c.GetType().GetMethod("SaveExcel");
if (saveExcelMethod == null) throw new ApplicationException("Incorrect version of FarPoint");
saveExcelMethod.Invoke(c);

Intellisense не работает, потому что, как сказал @C.Evenhuis, Activator.CreateInstance возвращается object, поэтому вы должны привести его к соответствующему типу.

Если тип не известен во время компиляции, но у вас есть доступ к базе кода, вы можете попытаться добавить интерфейс для него и реализовать его своим классом. Затем приведите объект к этому интерфейсу и используйте его. (Я не знаю вашей цели, но интерфейс может рассматриваться как контракт для всех типов, которые вы будете загружать динамически).

Если тип не известен во время компиляции и у вас нет доступа к базе кода, вы можете использовать отражение для вызова или использования метода dynamic вместо.

dynamic c = Activator.CreateInstance(MyDLLFormType);
c.SaveExcel(); // this method invocation will be bound in runtime.

Кстати будьте осторожны при использовании Assembly.LoadFile, Вы можете получить более подробную информацию из этой статьи.

Другие вопросы по тегам