F#中的DependencyAttribute类

时间:2018-06-19 22:08:56

标签: xamarin.forms f#

我正在研究Petzold的《使用Xamarin Forms创建移动应用程序》一书,将C#代码转换为F#,而GitHub上F#代码不可用(他在第7章之后停止发布FS)。在第189页的第9章中,他使用了Dependency属性,如下所示:

[assembly: Dependency(typeof(DisplayPlatformInfo.iOS.PlatformInfo))]
namespace DisplayPlatformInfo.iOS
{
  public interface IPlatformInfo
 {
 string GetModel();
 string GetVersion();
 }
  using System;
 using UIKit;
 using Xamarin.Forms;
  public class PlatformInfo : IPlatformInfo
 {
 UIDevice device = new UIDevice();
 //etc...

我想做F#中的等效操作。我创建了类型,唯一可以添加该属性的位置是在通用do()语句处:

type PlatformInfo () =
    [<assembly: Dependency(typeof(Greetings.iOS.PlatformInfo))>]
    do()

    interface IPlatformInfo with
        member this.GetModel () = 
            let device = new UIDevice()
            device.Model.ToString()
        member this.GetVersion () = 
            let device = new UIDevice()
            String.Format("{0} {1}", device.SystemName, device.SystemVersion)

问题是我得到

  

警告:此构造中将忽略属性。

我应该如何将此属性放入类型中?

2 个答案:

答案 0 :(得分:5)

F#中的装配级属性必须是in in模块,位于顶层。

我将上面的C#转换为:

namespace rec DisplayPlatformInfo.iOS

// Make a module specifically for this attribute
module DisplayPlatformAssemblyInfo =
    [<assembly: Dependency(typeof(Greetings.iOS.PlatformInfo))>]
    do ()

type IPlatformInfo =
    abstract member GetModel : unit -> string
    abstract member GetVersion : unit -> string

// ... Implement your type, etc

答案 1 :(得分:1)

由于它是程序集属性,因此应放置在模块的顶层,而不是类型。以下应该可以正常工作:

[<assembly: Dependency(typeof(Greetings.iOS.PlatformInfo))>]
do ()

type PlatformInfo () =
   // ...