使用C#-DisplayFormatAttribute中的属性格式化字段?

使用C#-DisplayFormatAttribute中的属性格式化字段?,c#,data-annotations,C#,Data Annotations,我正在寻找一种有效的方法来自动格式化实体中的数据字段,最好是使用属性 我们需要从数据模型生成一个PDF文件。我们希望确保交付内容的一致性,因此我们希望对某些数据字段(日期、电话号码、邮政编码等)应用一些格式规则。当然,我可以编写自定义属性和格式化代码,但我不想重新发明轮子。我看到了很多使用DataAnnotation(特别是DisplayFormat属性)的承诺,但我似乎找不到任何使用这些属性的内置类 如何在非UI(即非MVC)环境中实现这一点 下面是我们正在寻找的示例: public clas

我正在寻找一种有效的方法来自动格式化实体中的数据字段,最好是使用属性

我们需要从数据模型生成一个PDF文件。我们希望确保交付内容的一致性,因此我们希望对某些数据字段(日期、电话号码、邮政编码等)应用一些格式规则。当然,我可以编写自定义属性和格式化代码,但我不想重新发明轮子。我看到了很多使用DataAnnotation(特别是DisplayFormat属性)的承诺,但我似乎找不到任何使用这些属性的内置类

如何在非UI(即非MVC)环境中实现这一点

下面是我们正在寻找的示例:

public class MyDataModel
{
    [PhoneNumber]
    public string PhoneNumber { get; set; }

    public void FormatData()
    {
        //Invoke some .NET or other method changes the value of PhoneNumber into a desired format, i.e. (888)555-1234 based on its decorations.
    }
}
我还欢迎创建数据“视图”而不是更新原始对象的解决方案,即:

MyDataModel formatted = original.FormatData();

任何需要最少代码量的东西都是理想的。

您可以使用
MaskedTextBox

MaskedTextBox mtb = new MaskedTextBox();
mtb.Mask = "(999) 000-0000";
inputString=Regex.Replace(inputString, @"\D+", "");
mtb.Text = inputString;
然后你检查文本

string s=mtb.Text//s=“(204)867-5309”

你也可以对邮政编码做同样的事情,或者任何可以预测的格式

也许不是超级干净,但它肯定是快速和简单的

编辑:
我添加了一个正则表达式,以确保在用户在输入时使用连字符或括号时,仅将数字用作输入。

您必须使用反射来读取类型的属性。提供了一些应该有帮助的扩展方法。这是一个MVC问题,但在MVC之外也适用:


public static T GetAttribute(需要此MemberInfo成员bool)
其中T:Attribute
{
var attribute=member.GetCustomAttributes(typeof(T),false).SingleOrDefault();
if(属性==null&&isRequired)
{
抛出新的ArgumentException(
字符串格式(
CultureInfo.InvariantCulture,
“必须在成员{1}上定义{0}属性”,
类型(T)。名称,
成员(姓名);
}
返回(T)属性;
}
公共静态字符串GetPropertyDisplayName(表达式propertyExpression)
{
var memberInfo=GetPropertyInformation(propertyExpression.Body);
if(memberInfo==null)
{
抛出新的ArgumentException(
“未找到属性引用表达式。”,
“财产表达”);
}
var attr=memberInfo.GetAttribute(false);
if(attr==null)
{
返回memberInfo.Name;
}
返回attr.DisplayName;
}
公共静态成员信息GetPropertyInformation(表达式propertyExpression)
{
Assert(propertyExpression!=null,“propertyExpression!=null”);
MemberExpression memberExpr=propertyExpression作为MemberExpression;
if(memberExpr==null)
{
UnaryExpression unaryExpr=属性表达式为UnaryExpression;
if(unaryExpr!=null&&unaryExpr.NodeType==ExpressionType.Convert)
{
memberExpr=unaryExpr.Operator作为MemberExpression;
}
}
if(memberExpr!=null&&memberExpr.Member.MemberType==MemberTypes.Property)
{
返回成员Expr.Member;
}
返回null;
}
用途如下:

string displayName = ReflectionExtensions.GetPropertyDisplayName<SomeClass>(i => i.SomeProperty);
string displayName=ReflectionExtensions.GetPropertyDisplayName(i=>i.SomeProperty);

什么是屏蔽文本框?这对web项目外的OP有何帮助?MaskedTextBox是System.Windows.Forms的一部分。它将您设置的任何格式样式(即掩码)应用于输入文本,这似乎是OP想要的。它不应该与web项目有任何关系。反射可以工作,但如果可能的话,我真的在寻找内置的东西。例如,必须在.NET framework中内置一些东西才能实现这一点,因为DynamicData似乎是自动完成的,但我似乎找不到负责转换的类。我想他们会公开这些有用的类??
string displayName = ReflectionExtensions.GetPropertyDisplayName<SomeClass>(i => i.SomeProperty);