当动态转换到接口时InvalidCastException
本文关键字:InvalidCastException 接口 动态 转换 | 更新日期: 2023-09-27 17:53:34
我在程序集中定义了一个接口,如下所示:
namespace HelloWorlder
{
public interface IHelloWorld {
string SayHello();
}
}
在一个单独的程序集中,我有另一个类定义为:
using HelloWorlder;
public class HelloWorld : IHelloWorld {
string IHelloWorld.SayHello() {
return "Hello, world!";
}
}
现在尝试从f#交互式调用这个,我得到一个无效的强制转换异常,这是试图使用这个DLL的代码:
#I __SOURCE_DIRECTORY__
#r "HelloWorlder.dll"
open System
open System.Reflection
open HelloWorlder
let asm = Assembly.LoadFrom(__SOURCE_DIRECTORY__ + "''HelloWorld.dll")
let hwIns = asm.CreateInstance("HelloWorld") :?> IHelloWorld
let res = hwIns.SayHello()
从我可以看到它应该工作,作为一个额外的预防措施,你会看到我已经显式地实现了接口IHelloWorld
。我猜有一些东西,我错过了,但我不知道为什么它抛出一个cast异常。
事实证明,我实际上必须打开对象而不是强制转换它,然后它工作得很好。
let hwIns = asm.CreateInstance("HelloWorld") |> unbox<IHelloWorld>