繁体   English   中英

无法使用Activator.CreateInstance创建对象

[英]not able to create object with 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();

它们可用,只是在编译时不可用。 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要小心。 您可能会从本文中获得更多详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM