2017-03-01 39 views
0

如果我在c#中声明一个类,我可以设置字符串长度等属性吗?设置属性例如字符串长度

例如说我的课是:

public class MyClass 
{ 
    public string SomeString1 {get; set;} 
    public string AnotherString2 {get; set;} 
} 

有没有办法指定SomeString1只有x个字符长?

+0

听起来像一个工作对于AOP ... –

+1

听起来像[XY问题](http://xyproblem.info/) –

+0

如果我尝试放置*更长的字符串,您必须决定执行什么操作。它会是一个例外吗?该修剪线吗?还有别的吗? –

回答

1

您可以使用在.NET DataAnnotations类StringLengthAttribute

[StringLength(40, ErrorMessage = "Name cannot be longer than 40 characters.")] 
public string YourString { get; set; } 

如果你在MVC工作,这些DataAnnotations将在传入的请求验证以及错误信息可以在相关的自动显示视图。

如果你没有在MVC工作,或者只是想验证一个类实例的ad-hoc,则可以使用Validator类:How to manually validate a model with attributes?

+2

取决于谁打算收集信息。例如。核心运行时不限制字符串长度,不管附加哪个属性。 –

+1

仅当他们使用侦听DataAnnotations的技术时才有用,否则回答良好 – MikeT

+0

如我的答案中所述,Validator类可用于> = .net 4中的临时验证。 –

1

你所要求的是验证,并有几种不同在.NET Framework

一些例子是IDataErrorInfoINotifyDataErrorInfoValidationRule

可用的验证路线哪一个更适合你取决于你在做什么

WPF被设计为自动包括这些在意见,提供了诸如here一些很好的例子,但他们的工作也同样适用于手动验证测试

public class MyClass: IDataErrorInfo 
{ 
    public string SomeString1 { get; set; } 
    public string AnotherString2 { get; set; } 

    public bool IsValid 
     => string.IsNullOrWhiteSpace(Error); 
    public string Error 
     => this["All"]; 

    public string this[string field] 
    { 
     get 
     { 
      string err = ""; 
      if (field == "All" || "SomeString1" == field) 
      { 
       if (SomeString1.Length > 15) 
        err += "SomeString1 > 15"; 
       if (SomeString1.Length < 5) 
        err += "SomeString1 < 5"; 
      } 
      if (field == "All" || nameof(AnotherString2) == field) 
      { 
       err += StringLenthRule(AnotherString2, nameof(AnotherString2), 30, 20); 
      } 
      return err; 
     } 
    } 
    private string StringLenthRule(string str, string prop,int max, int min) 
    { 
     string err = ""; 
     if (str.Length > max) 
      err += $"{prop} > {max}\n"; 
     if (str.Length < min) 
      err += $"{prop} < {min}\n"; 
     return err; 

    } 
} 

,那么你会怎么做

MyClass node = new MyClass(xmlNode); 

if(node.IsValid) 
{ 
    //use class 
} 
else 
{ 
    display(node.Error) 
} 
+0

谢谢。上下文是一个Web服务,它将解析XML文件,并将每个节点加载到数据库文件中。所以我明白我需要自己验证每个节点。 – Dave

+0

他们一般的方式是将数据加载到类中,然后检查这个可能性是否使用'public bool IsValid => string.IsNullOrWhiteSpace(IDataErrorInfo.Error)',然后告诉你该类是否有效并且不是错误属性将识别问题,您可以使用此属性来拒绝xml或自动/手动更正 – MikeT