C# 自定义特性属性 限制自定义字段 数据
不知道怎么表达这个东西,先记录一下吧,如果你们有好的想法可以联系我,共同进步
/// <summary>
/// 自定义属性帮助类
/// </summary>
public class AttributeHelper
{
/// <summary>
/// 获取字符串字节长度
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static int StringToByteLength(string str)
{
//使用Unicode编码的方式将字符串转换为字节数组,它将所有字符串(包括英文中文)全部以2个字节存储
byte[] bytestr = System.Text.Encoding.UTF8.GetBytes(str);
int j = 0;
for (int i = 0; i < bytestr.GetLength(0); i++)
{
//取余2是因为字节数组中所有的双数下标的元素都是unicode字符的第一个字节
if (i % 2 == 0)
{
j++;
}
else
{
//单数下标都是字符的第2个字节,如果一个字符第2个字节为0,则代表该Unicode字符是英文字符,否则为中文字符
if (bytestr[i] > 0)
{
j++;
}
}
}
return j;
}
/// <summary>
/// 验证字段属性
/// </summary>
public void Validate()
{
ValidationContext context = new ValidationContext(this, serviceProvider: null, items: null);
List<ValidationResult> results = new List<ValidationResult>();
bool isValid = Validator.TryValidateObject(this, context, results, true);
if (isValid == false)
{
StringBuilder sbrErrors = new StringBuilder();
foreach (var validationResult in results)
{
sbrErrors.AppendLine(validationResult.ErrorMessage);
}
throw new ValidationException(sbrErrors.ToString());
}
}
/// <summary>
/// 判断字符串字节长度
/// </summary>
public class IsByteLength : ValidationAttribute
{
public IsByteLength(string errorMsg, int len)
{
this.ErrorMsg = errorMsg;
this.Len = len;
}
public string ErrorMsg { get; private set; }
public int Len { get; private set; }
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value.GetType().Equals(typeof(string)))
{
if (StringToByteLength(value.ToString()) > Len)
{
var error = new ValidationResult(ErrorMsg);
return error;
}
}
return null;
}
}
public static string ObjToString( object thisValue)
{
if (thisValue != null) return thisValue.ToString().Trim();
return "";
}
public class IsFieldVereist : ValidationAttribute
{
public string ErrorMsg { get; private set; }
public string TypeName { get; private set; }
public IsFieldVereist(string errorMsg, string typeName="")
{
this.ErrorMsg = errorMsg;
this.TypeName = typeName;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (!string.IsNullOrWhiteSpace(TypeName))
{
var tempData = Convert.ChangeType(validationContext.ObjectInstance, validationContext.ObjectType);
System.Reflection.PropertyInfo propertyInfo = validationContext.ObjectType.GetProperty(TypeName);
if (value != null || !string.IsNullOrWhiteSpace(ObjToString(value)))
{
if (propertyInfo.GetValue(tempData, null) == null)
{
var error = new ValidationResult(ErrorMsg);
return error;
}
}
}
else
{
if (value == null || string.IsNullOrWhiteSpace(ObjToString(value)))
{
var error = new ValidationResult(ErrorMsg);
return error;
}
}
return null;
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现