C# 所有属性的修剪操作
我有一个典型的网站与管理部分,管理员可以添加许多不同的实体。一、 作为开发人员,必须对它们进行修剪(以防止输入诸如“状态名称”之类的实体)。我这样做,即在Validate方法IValidatableObject接口中:C# 所有属性的修剪操作,c#,trim,C#,Trim,我有一个典型的网站与管理部分,管理员可以添加许多不同的实体。一、 作为开发人员,必须对它们进行修剪(以防止输入诸如“状态名称”之类的实体)。我这样做,即在Validate方法IValidatableObject接口中: public class AddProjectViewModel : ProjectFormBaseViewModel, IValidatableObject { public int? ParentProjectID { get; set; }
public class AddProjectViewModel : ProjectFormBaseViewModel, IValidatableObject
{
public int? ParentProjectID { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
ProjectName = ProjectName.Trim();
DescriptionText = DescriptionText.Trim();
公共类AddProjectViewModel:ProjectFormBaseViewModel,IValidatableObject
{
public int?ParentProjectID{get;set;}
公共IEnumerable验证(ValidationContext ValidationContext)
{
ProjectName=ProjectName.Trim();
DescriptionText=DescriptionText.Trim();
当然,我可以在project添加到DB或其他任何内容的方法中完成。
但如果我有10个表单,每个表单有2-3个字符串属性,那么这段代码就有点“直截了当”。也许任何人都可以推荐其他更“漂亮”的方法来修剪所有字符串参数?例如,通过属性属性或其他什么?为什么不使用反射
var obj = YourObjectToBeTrimmed();
foreach(var property in obj.GetType().GetProperties().Where(x => x.PropertyType == typeof(string))) {
property.SetValue(obj, (property.GetValue(obj) as string).Trim());
}
还可以使用反射的属性或其他修改
编辑。现在,由于OP的请求,我修改了我的答案。在下面的代码中,所有由TrimAttribute标记的属性都将被修剪
class Program {
static void Main(string[] args) {
// The sample properties.
var notTrimmedString = " smth ";
var trimmedString = notTrimmedString.Trim();
// Prepare an object to trim its properties.
var obj = new A {
PropertyToBeTrimmed = notTrimmedString,
PropertyNotToBeTrimmed = notTrimmedString,
};
// Trim properties marked by TrimAttribute.
foreach(var property in obj.GetType().GetProperties().Where(x =>
x.PropertyType == typeof(string) &&
x.GetCustomAttributes(typeof(TrimAttribute), true).Any())) {
property.SetValue(obj, (property.GetValue(obj) as string).Trim());
}
// Check.
Console.WriteLine(obj.PropertyToBeTrimmed == notTrimmedString);
Console.WriteLine(obj.PropertyNotToBeTrimmed == notTrimmedString);
Console.WriteLine(obj.PropertyToBeTrimmed == trimmedString);
Console.WriteLine(obj.PropertyNotToBeTrimmed == trimmedString);
Console.ReadKey();
}
}
/// <summary>
/// Sample class.
/// </summary>
class A {
/// <summary>
/// This property must be marked by TrimAttribute.
/// So it will be trimmed.
/// </summary>
[Trim]
public string PropertyToBeTrimmed { get; set; }
/// <summary>
/// This property must be not marked by TrimAttribute.
/// So it will not be trimmed.
/// </summary>
public string PropertyNotToBeTrimmed { get; set; }
}
/// <summary>
/// Custom attribute which means need for trimming.
/// </summary>
class TrimAttribute : Attribute { }
类程序{
静态void Main(字符串[]参数){
//示例属性。
var notTrimmedString=“smth”;
var trimmedString=notTrimmedString.Trim();
//准备对象以修剪其属性。
var obj=新A{
PropertyToBeTrimmed=notTrimmedString,
PropertyNotToBeTrim=notTrimmedString,
};
//由TrimAttribute标记的修剪特性。
foreach(obj.GetType().GetProperties()中的var属性。其中(x=>
x、 PropertyType==typeof(字符串)&&
x、 GetCustomAttributes(typeof(TrimAttribute),true.Any()){
SetValue(obj,(property.GetValue(obj)作为字符串).Trim());
}
//检查。
Console.WriteLine(obj.PropertyToBeTrimmed==notTrimmedString);
Console.WriteLine(obj.PropertyNotToBeTrimmed==notTrimmedString);
Console.WriteLine(obj.PropertyToBeTrimmed==trimmedString);
Console.WriteLine(obj.PropertyNotToBeTrimmed==trimmedString);
Console.ReadKey();
}
}
///
///示例类。
///
甲级{
///
///此属性必须由TrimAttribute标记。
///因此,它将被修剪。
///
[修剪]
公共字符串PropertyToBeTrimmed{get;set;}
///
///此属性不能由TrimAttribute标记。
///所以它不会被修剪。
///
公共字符串PropertyNotToBeTrimmed{get;set;}
}
///
///自定义属性,表示需要修剪。
///
类属性:属性{}
如果您不熟悉反射和属性,我想本教程将对您有所帮助。为什么不使用反射
var obj = YourObjectToBeTrimmed();
foreach(var property in obj.GetType().GetProperties().Where(x => x.PropertyType == typeof(string))) {
property.SetValue(obj, (property.GetValue(obj) as string).Trim());
}
还可以使用反射的属性或其他修改
编辑。现在,由于OP的请求,我修改了我的答案。在下面的代码中,所有由TrimAttribute标记的属性都将被修剪
class Program {
static void Main(string[] args) {
// The sample properties.
var notTrimmedString = " smth ";
var trimmedString = notTrimmedString.Trim();
// Prepare an object to trim its properties.
var obj = new A {
PropertyToBeTrimmed = notTrimmedString,
PropertyNotToBeTrimmed = notTrimmedString,
};
// Trim properties marked by TrimAttribute.
foreach(var property in obj.GetType().GetProperties().Where(x =>
x.PropertyType == typeof(string) &&
x.GetCustomAttributes(typeof(TrimAttribute), true).Any())) {
property.SetValue(obj, (property.GetValue(obj) as string).Trim());
}
// Check.
Console.WriteLine(obj.PropertyToBeTrimmed == notTrimmedString);
Console.WriteLine(obj.PropertyNotToBeTrimmed == notTrimmedString);
Console.WriteLine(obj.PropertyToBeTrimmed == trimmedString);
Console.WriteLine(obj.PropertyNotToBeTrimmed == trimmedString);
Console.ReadKey();
}
}
/// <summary>
/// Sample class.
/// </summary>
class A {
/// <summary>
/// This property must be marked by TrimAttribute.
/// So it will be trimmed.
/// </summary>
[Trim]
public string PropertyToBeTrimmed { get; set; }
/// <summary>
/// This property must be not marked by TrimAttribute.
/// So it will not be trimmed.
/// </summary>
public string PropertyNotToBeTrimmed { get; set; }
}
/// <summary>
/// Custom attribute which means need for trimming.
/// </summary>
class TrimAttribute : Attribute { }
类程序{
静态void Main(字符串[]参数){
//示例属性。
var notTrimmedString=“smth”;
var trimmedString=notTrimmedString.Trim();
//准备对象以修剪其属性。
var obj=新A{
PropertyToBeTrimmed=notTrimmedString,
PropertyNotToBeTrim=notTrimmedString,
};
//由TrimAttribute标记的修剪特性。
foreach(obj.GetType().GetProperties()中的var属性。其中(x=>
x、 PropertyType==typeof(字符串)&&
x、 GetCustomAttributes(typeof(TrimAttribute),true.Any()){
SetValue(obj,(property.GetValue(obj)作为字符串).Trim());
}
//检查。
Console.WriteLine(obj.PropertyToBeTrimmed==notTrimmedString);
Console.WriteLine(obj.PropertyNotToBeTrimmed==notTrimmedString);
Console.WriteLine(obj.PropertyToBeTrimmed==trimmedString);
Console.WriteLine(obj.PropertyNotToBeTrimmed==trimmedString);
Console.ReadKey();
}
}
///
///示例类。
///
甲级{
///
///此属性必须由TrimAttribute标记。
///因此,它将被修剪。
///
[修剪]
公共字符串PropertyToBeTrimmed{get;set;}
///
///此属性不能由TrimAttribute标记。
///所以它不会被修剪。
///
公共字符串PropertyNotToBeTrimmed{get;set;}
}
///
///自定义属性,表示需要修剪。
///
类属性:属性{}
如果您不熟悉反射和属性,我想本教程将对您有所帮助。您可以修剪ViewModel本身中的属性吗
public class MyModel
{
private string _prop;
public string Prop
{
get
{
return !string.IsNullOrEmpty(_prop) ? _prop.Trim() : this._prop;
}
set
{
this._prop = value.Trim();
}
}
}
可以修剪ViewModel本身中的属性吗
public class MyModel
{
private string _prop;
public string Prop
{
get
{
return !string.IsNullOrEmpty(_prop) ? _prop.Trim() : this._prop;
}
set
{
this._prop = value.Trim();
}
}
}
但是,如果我想修剪除一个以外的所有头发?:)需要另一种方法…也许属性会更好…@OlegSh我已经更新了我的答案。请参阅代码中的解释和注释。但如果我想修剪除一个之外的所有内容?:)需要另一种方法…也许属性会更好…@OlegSh我已经更新了我的答案。请参阅代码中的解释和注释。