Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 所有属性的修剪操作_C#_Trim - Fatal编程技术网

C# 所有属性的修剪操作

C# 所有属性的修剪操作,c#,trim,C#,Trim,我有一个典型的网站与管理部分,管理员可以添加许多不同的实体。一、 作为开发人员,必须对它们进行修剪(以防止输入诸如“状态名称”之类的实体)。我这样做,即在Validate方法IValidatableObject接口中: public class AddProjectViewModel : ProjectFormBaseViewModel, IValidatableObject { public int? ParentProjectID { get; set; }

我有一个典型的网站与管理部分,管理员可以添加许多不同的实体。一、 作为开发人员,必须对它们进行修剪(以防止输入诸如“状态名称”之类的实体)。我这样做,即在Validate方法IValidatableObject接口中:

   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我已经更新了我的答案。请参阅代码中的解释和注释。