动态转换为接口时出现 InvalidCastException
InvalidCastException when casting dynamically to interface
我在这样的程序集中定义了一个接口:
namespace HelloWorlder
{
public interface IHelloWorld {
string SayHello();
}
}
在一个单独的程序集中,我有另一个 class 定义为:
using HelloWorlder;
public class HelloWorld : IHelloWorld {
string IHelloWorld.SayHello() {
return "Hello, world!";
}
}
现在尝试从 F# Interactive 调用它时我得到一个无效的转换异常,下面是尝试使用此 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
。我猜我遗漏了一些东西,但我不明白为什么它会抛出强制转换异常。
事实证明,我实际上不得不拆箱而不是铸造它,然后它工作得很好。
let hwIns = asm.CreateInstance("HelloWorld") |> unbox<IHelloWorld>
我在这样的程序集中定义了一个接口:
namespace HelloWorlder
{
public interface IHelloWorld {
string SayHello();
}
}
在一个单独的程序集中,我有另一个 class 定义为:
using HelloWorlder;
public class HelloWorld : IHelloWorld {
string IHelloWorld.SayHello() {
return "Hello, world!";
}
}
现在尝试从 F# Interactive 调用它时我得到一个无效的转换异常,下面是尝试使用此 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
。我猜我遗漏了一些东西,但我不明白为什么它会抛出强制转换异常。
事实证明,我实际上不得不拆箱而不是铸造它,然后它工作得很好。
let hwIns = asm.CreateInstance("HelloWorld") |> unbox<IHelloWorld>