【发布时间】:2013-12-02 09:59:18
【问题描述】:
我目前正在与 F# 中的 C# 代码进行互操作。
是否可以在 F# 中定义一个在 C# 中如下所示的属性?
private Func<PropertyInfo, bool> OnIsSatisfiedByProperty { get; set; }
(在 F# 中,它不必是 Func<T, TResult>,而是等价的。)
【问题讨论】:
-
还有更多信息吗?即这真的是
protected或public吗?您是否在 F# 中声明将在 C# 中使用的接口?你将如何初始化它?有一个实际的 getter 或 setter 方法重要吗?你关心有保护条款的二传手吗?在没有进一步上下文的情况下,我的默认答案是let private mutable OnIsSatisfiedByProperty : (PropertyInfo -> bool) option = None。然后您可以使用Option.iteret.al 删除空检查。或者,您可以将其作为主要 ctor arg 进行工作:type X( ?OnIsSatisfiedByProperty) = ...如果可变性没有价值 -
@RubenBartelink 它可以被声明为内部的,但这在我的场景中并不重要。它实际上是一个测试类型。可以使用构造函数注入来提供该值,但对于此类测试类型,我习惯性地使用对象初始化器来提供。
-
所以,我们可以假设您在 F# 中声明测试类型,然后需要它可以从 C# 初始化,因此这不是“可能”
internal的问题 - 你需要它public/internal而不是private?如果是这样,静态类型就变得非常重要; @John Palmer 的回答(和我的评论)创建了一个FSharpFunc<PropertyInfo,bool>,因此他的扭曲必须重新初始化。 -
测试类型是在 F# 中定义的,它将在 F# 中使用。设计是 C#-ish(我也有一个 C# 中的工作示例,因此具有初始互操作性) - 现在我首先遵循 OO 设计以查看测试通过,然后,我想,我会慢慢转向更多的 FP范式。
-
很公平 - 最终,如果您需要/想要一个公共设置器,那么
val是要走的路。但我希望转向type test( onIsSatisfiedByProperty? ) =结构,以便能够依靠Option.* - 但这取决于您实际互操作要求的确切性质