C# 可由便携式F#项目读取的本地化(配置文件259)
我正在参加Visual Studio 2017 RC的试驾,遇到了一个绊脚石 我的项目包含一个ASP.NET核心Web项目和两个可移植的F#库(概要文件259)。web项目引用了这些库,我希望将来添加Xamarin表单项目,这些项目也引用相同的Profile 259库 我还希望有一个本地化资源文件(可能在它自己的共享项目中),我的解决方案中的所有项目都可以读取该文件。在Visual Studio 2015中,我通过创建一个可移植的C#项目并添加相关的C# 可由便携式F#项目读取的本地化(配置文件259),c#,f#,visual-studio-2017,C#,F#,Visual Studio 2017,我正在参加Visual Studio 2017 RC的试驾,遇到了一个绊脚石 我的项目包含一个ASP.NET核心Web项目和两个可移植的F#库(概要文件259)。web项目引用了这些库,我希望将来添加Xamarin表单项目,这些项目也引用相同的Profile 259库 我还希望有一个本地化资源文件(可能在它自己的共享项目中),我的解决方案中的所有项目都可以读取该文件。在Visual Studio 2015中,我通过创建一个可移植的C#项目并添加相关的resx文件实现了这一点 在Visual S
resx
文件实现了这一点
在Visual Studio 2017中,我无法添加可移植的C#类库。当我尝试这样做时,它会提供一个模式对话框,该对话框不接受它提供给我的任何选项:
但是,我可以添加一个Xamarin表单库:
虽然这引用了我并不感兴趣的Xamarin表单库,但至少可以添加它,我可以将本地化文件LocalisedStrings.resx
添加到项目中
但是,即使我在resx
文件中将访问修饰符更改为“Public”,也无法从我的F#库中读取它。代码
module Locales =
let [<Literal>] private Gender = "Gender"
let private localisedStringsProperties = typeof<LocalisedStrings>.GetTypeInfo().DeclaredProperties
let GetStringDictionary(predicate) = localisedStringsProperties |> Seq.filter predicate |> Seq.map (fun p -> (p.Name, p.GetMethod.Invoke(null, [||]).ToString())) |> dict
let GetGenders() = GetStringDictionary(fun p -> p.Name.StartsWith(Gender) && p.Name.Length > Gender.Length)
let GetValues(keys) =
let values = GetStringDictionary(fun p -> keys |> Array.exists(fun key -> key = p.Name))
let evaluate key =
match values.ContainsKey key with
| true -> values.[key]
| false -> key
keys |> Array.map evaluate
let GetValue(key) = GetValues([|key|]).[0]
模块区域设置=
让[]私人性别=“性别”
让private LocalizedStringsProperties=typeof.GetTypeInfo().DeclaredProperties
让GetStringDictionary(谓词)=LocalizedStringsProperties |>Seq.filter谓词|>Seq.map(fun p->(p.Name,p.GetMethod.Invoke(null,[| |]].ToString())|>dict
让GetGenders()=GetStringDictionary(fun p->p.Name.StartsWith(Gender)&&p.Name.Length>Gender.Length)
让GetValue(键)=
让value=GetStringDictionary(fun p->keys |>Array.exists(fun key->key=p.Name))
让我们来评估关键点=
将values.ContainsKey键与
|真->值。[键]
|false->key
keys |>Array.map求值
让GetValue(键)=GetValues([|键|])[0]
无法识别命名空间或类LocalisedStrings
问题
resx
文件,这就是我在2015年的项目中使用便携式C#库的原因。然而,如果有一种更有效的方法,我愿意使用它LocalisedStrings
类和命名空间,即使项目引用已成功添加,并且resx
access修饰符已更改为public更新:问题2已得到回答。这是一个PEBKAC问题:我只需选中多个复选框。在本例中,我需要检查配置文件259中包含的所有选项(.NET Framework 4,5,ASP.NET Core 1.0,Windows 8,Windows Phone 8.1,Windows Phone Silverlight 8)。然而,问题1和问题3仍然存在。这听起来像是一个bug,您可能应该复制这个优秀而详细的描述并报告它。这很可能也能回答你的第二个问题,尽管我怀疑它是否被抹黑。作为循环参考,看起来像你。感谢亚伯的建议。只需稍作修改。