C# 用于更改属性值的自定义属性

C# 用于更改属性值的自定义属性,c#,asp.net-mvc,custom-attributes,C#,Asp.net Mvc,Custom Attributes,我有一门课叫say Class1 public string store { get; set; } 我想要的是用这样的东西来装饰它 Class1 [GetStoreNumberFromName] [IsNumeric] public string store {get; set; } 因此,该值可能是1234,也可能是1234-storename 我需要做的是检查传递的值中是否只有数字。如果没有,那么在第二个示例中,我需要获取前4个chr并将属性的值更改为该值 因此,如果传

我有一门课叫say

Class1
  public string store { get; set; }
我想要的是用这样的东西来装饰它

Class1
  [GetStoreNumberFromName]
  [IsNumeric]
  public string store {get; set; }
因此,该值可能是
1234
,也可能是
1234-storename

我需要做的是检查传递的值中是否只有数字。如果没有,那么在第二个示例中,我需要获取前4个chr并将属性的值更改为该值


因此,如果传入的值是
1234-Store Name
,那么在
[GetStoreNumberFromName]
的末尾,
Store
的值应该是
1234
,这样
[IsNumeric]
将作为有效值传入。

好。。希望我了解您的要求:

class GetStoreNumberFromNameAttribute : Attribute {
}

class Class1 {
    [GetStoreNumberFromName]
    public string store { get; set; }
}

class Validator<T>
{
    public bool IsValid(T obj)
    {
        var propertiesWithAttribute = typeof(T)
                                      .GetProperties()
                                      .Where(x => Attribute.IsDefined(x, typeof(GetStoreNumberFromNameAttribute)));

        foreach (var property in propertiesWithAttribute)
        {
            if (!Regex.Match(property.GetValue(obj).ToString(), @"^\d+$").Success)
            {
                property.SetValue(obj, Regex.Match(property.GetValue(obj).ToString(), @"\d+").Groups[0].Value);
            }
        }

        return true;
    }
}
class GetStoreNumberFromNameAttribute:属性{
}
一班{
[GetStoreNumberFromName]
公共字符串存储{get;set;}
}
类验证器
{
公共bool有效(T obj)
{
var propertiesWithAttribute=typeof(T)
.GetProperties()
其中(x=>Attribute.IsDefined(x,typeof(GetStoreNumberFromNameAttribute));
foreach(propertiesWithAttribute中的var属性)
{
如果(!Regex.Match(property.GetValue(obj.ToString(),@“^\d+$”).Success)
{
property.SetValue(obj,Regex.Match(property.GetValue(obj.ToString(),@“\d+”).Groups[0].Value);
}
}
返回true;
}
}
…用法:

var obj = new Class1() { store = "1234 - Test" };
Validator<Class1> validator = new Validator<Class1>();
validator.IsValid(obj);

Console.WriteLine(obj.store); // prints "1234"
var obj=newclass1(){store=“1234-Test”};
Validator Validator=新验证器();
validator.IsValid(obj);
控制台写入线(对象存储);//打印“1234”
…显然,你这方面需要一些改变。。但是它应该给你一个想法(我知道方法命名可能不是最好的….:/)


如果我完全忽略了这一点,请告诉我,我将删除。

在单独的类中处理此问题与编写迭代属性的类有什么区别?对于您的需求,属性是否有点过火?@SimonWhitehead,这并不是真的过火,因为我在类中使用它们进行验证、错误消息以及字段是否是必需的。因此,我希望截取该值并对其进行修改,以便正常验证可以通过该值而不会使其失败