Clojure CLR - 实现包含属性的接口

5

我正在尝试实现一个带有属性的接口,但似乎无法使其正常工作,而且在谷歌上也没有找到相关的例子(至少目前还没有)。我相信我在这里做错了什么,但不知道该如何解决。

(System.Reflection.Assembly/LoadWithPartialName "System.Web")

; naive, just trying to figure out how to implement the IHttpHandler interface in Clojure 
(defn foo-handler []
    (reify System.Web.IHttpHandler
        (IsReusable [] false)
        (ProcessRequest [context] ())))

IsReusable是一个属性,我不知道如何告诉reify它不是传统的函数。

CompilerException clojure.lang.CljCompiler.Ast.ParseException: Must supply at least one argument for 'this' in: IsReusable

好的,我为IsReusable提供了'this'。
CompilerException clojure.lang.CljCompiler.Ast.ParseException: Can't define method not in interfaces: IsReusable

我也尝试过代理,但结果类似。

我还尝试将IsReusable重命名为get_IsReusable,但实际上并没有什么区别,我得到与上面相同的编译器错误。

我还尝试过deftype,但是我收到了完全不同的错误:

(deftype foo-handler []
  System.Web.IHttpHandler
  (get_IsReusable [this] false)
  (ProcessRequest [this context] ()))

编译错误:

InvalidCastException Unable to cast object of type 'clojure.lang.Var' to type 'System.Type'.  clojure.lang.Namespace.ReferenceClass 

更新:

关于 deftype 的代码是有效的,我无法复现我先前发布的错误。现在我不知道当时做错了什么。


2
如果你愿意,可以回答自己的问题并接受该回答。 - BlackBear
1个回答

11

这让我进行了数小时的研究和尝试,但最终我成功了!

user=> (def foo-handler
(reify System.Web.IHttpHandler
        (get_IsReusable [this] false)
        (ProcessRequest [this context] ())))
#'user/foo-handler
user=>

成功!

user=> (instance? System.Web.IHttpHandler foo-handler)
true

这种方法在ASP.NET应用程序中更好,并且可以正常运行:

(deftype foo-handler []
  System.Web.IHttpHandler
  (get_IsReusable [this] false)
  (ProcessRequest [this context] 
    (.Write (.Response context) "Hello, From Clojure CLR!")))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接