Не удалось создать объект с помощью 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
, Вы можете получить более подробную информацию из этой статьи.