Fly*_*ynn 7 .net c# microsoft-metro windows-runtime windows-store-apps
在我的Windows Store(Metro)应用程序中,我正在为我的对象使用DataAnnotations.一切正常.
现在我尝试将我的字符串放入Resource.resw文件中.DataAnnotations需要填充2个属性:ErrorMessageResourceName和ErrorMessageResourceType.如何使用ErrorMessageResourceType新资源类型?
public class Person : Entity
{
private string _firstName;
[Required( ErrorMessageResourceName = "GenericFieldRequired", ErrorMessageResourceType = typeof( ??? ))]
public string FirstName {
get { return _firstName; }
set { SetPropertyChanged( ref _firstName, value, this ); }
}
}
Run Code Online (Sandbox Code Playgroud)
有什么建议?
更新: 我找到了一个自动生成Resources.cs文件的Visual Studio工具:
经过大量挖掘后,我想我明白为什么你会遇到问题.
在其他项目类型中,资源文件自动转换为具有静态方法的类,称为资源键的名称.
没有办法真正自动执行此操作,因此我编写了一个T4模板,可以帮助您解决这个问题.
<#@ template debug="false" hostspecific="True" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Xml" #>
<#@ assembly name="System.Xml" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>
using Windows.ApplicationModel.Resources;
<#
var namespaceName = System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("NamespaceHint");
#>
namespace <#= namespaceName #>
{
public class ResourceHelper
{
private static readonly ResourceLoader resourceLoader = new ResourceLoader("Resources");
<# using (XmlReader reader = XmlReader.Create(Host.ResolvePath("Resources.resw")))
{
bool found=reader.ReadToFollowing("data");
while(found)
{
reader.MoveToFirstAttribute();
string name = reader.Value;
#>
public static string <#= name #>
{
get
{
return resourceLoader.GetString("<#= name #>");
}
}
<#
found=reader.ReadToFollowing("data");
}
}#>
}
}
Run Code Online (Sandbox Code Playgroud)
如果将模板放在与资源文件相同的文件夹中,它将输出一个名为ResourceHelper.cs的文件.然后可以在您的对象模型中使用它: -
[Required(ErrorMessageResourceName = "validation_string", ErrorMessageResourceType = typeof(ResourceHelper))]
Run Code Online (Sandbox Code Playgroud)
请注意,有一些限制.首先,我不太擅长T4模板,所以代码可能会大大改进.现在你必须确保你给资源的名称产生一个有效的方法名称 - 不要在那里放置空格!
其次,当您在资源文件中添加新的键/值时,模板不会自动生成,您必须进入模板并点击保存.
除此之外它应该工作正常 - 希望它有所帮助!