[英]Weird behavior using Activator.CreateInstance
假设我在类库中定义了以下类层次结构:
public interface IFoo
{
string GetMsg();
}
public abstract class FooBase
{
public virtual string GetMsg()
{
return "Foobase msg";
}
}
public class Foo : FooBase, IFoo
{
#region IFoo Members
public new string GetMsg()
{
return base.GetMsg();
}
#endregion
}
我在控制台应用程序中使用了该程序集,并使用反射创建了输入为IFoo的Foo类的实例,如下所示:
Assembly a = Assembly.LoadFile(Path.GetFullPath("TestClassLib.dll"));
var typeDef = a.GetType("TestClassLib.Foo");
var fooInst = Activator.CreateInstance(typeDef) as IFoo;
string msg = fooInst.GetMsg();
以上工作正常。 现在,如果我采用以下代码并将其移植到ASP.NET Web网页上,如下所示:
namespace TestWebApp
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string filePath = Server.MapPath(@"~/bin/TestClassLib.dll");
Assembly a = Assembly.LoadFile(Path.GetFullPath(filePath));
var typeDef = a.GetType("TestClassLib.Foo");
var fooInst = Activator.CreateInstance(typeDef) as IFoo;
string msg = fooInst.GetMsg();
}
}
}
fooInst在以下行中为null:
var fooInst = Activator.CreateInstance(typeDef) as IFoo;
有趣的是,当我调试网页时,在'typeDef'变量中有一个有效的类型定义,而且很奇怪的是,如果我将Activator.CreateInstance(typeDef) as IFoo
到Visual Studio的“监视”窗口中,则结果不为null。 !
我在这里想念什么?
PS-我已经验证了Assembly(TestClassLib.dll)是否存在于ASP.NET应用程序的bin目录中。
我的猜测是,您是从Activator.CreateInstance取回对象的,但是防御性的强制转换(“作为IFoo”)失败了,这可能是由于加载上下文(因为使用LoadFrom加载了程序集,请参见此处 )。 是否在调用程序集和要动态加载的程序集中都定义了IFoo性能? 也许尝试通过使用具有程序集限定类型名称的Type.GetType()来让Fusion加载程序集,以查看是否得到相同的结果(也可以尝试将存储在对象引用中而不带“ as”,以确保CreateInstance给您)回来的东西 )。
据我所知,你只能使用as
上课的时候/类型你是铸造有一个构造函数。 显然,接口没有构造函数。 因此,您必须使用常规样式进行装箱:
var fooInst = (IFoo)Activator.CreateInstance(typeDef);
我很确定是这种情况,但是我可能是错的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.