我正在研究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)
问题是我得到
警告:此构造中将忽略属性。
我应该如何将此属性放入类型中?
答案 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 () =
// ...