动态转换为接口

时间:2015-06-04 09:00:38

标签: c# reflection f#

我在这样的程序集中定义了一个接口:

namespace HelloWorlder
{
    public interface IHelloWorld {
        string SayHello();
    }
}

在一个单独的程序集中,我有另一个类定义为:

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。我猜测有些东西我不知道但是我无法弄清楚它为什么会抛出一个强制转换异常。

1 个答案:

答案 0 :(得分:1)

事实证明,我实际上必须取消对象而不是对其进行转换,然后它才能正常工作。

let hwIns = asm.CreateInstance("HelloWorld") |> unbox<IHelloWorld>