C# 反射
#define ZZS
using System ;
using System. Diagnostics ;
namespace ConsoleApp8
{
internal static class Program
{
private static void Main ( string [ ] args)
{
var man = new Man ( )
{
name = "s22s" ,
info = "1233" ,
age = "13"
} ;
try
{
new ValidationModel ( ) . Validate ( man) ;
}
catch ( Exception e)
{
Console. WriteLine ( e) ;
}
Console. ReadKey ( ) ;
}
}
internal static class ToolKit
{
[ Conditional ( "ZZS" ) ]
public static void F1 ( )
{
Console. WriteLine ( 1 ) ;
}
[ Conditional ( "ZZS" ) ]
public static void F2 ( )
{
Console. WriteLine ( 2 ) ;
}
[ Conditional ( "WY" ) ]
public static void F3 ( )
{
Console. WriteLine ( 3 ) ;
}
[ Conditional ( "WY" ) ]
public static void F4 ( )
{
Console. WriteLine ( 4 ) ;
}
}
[ AttributeUsage ( AttributeTargets. Field) ]
internal class StringLengthAttribute : Attribute
{
private int _maxLength;
public int MaxLength => _maxLength;
public StringLengthAttribute ( int length)
{
this . _maxLength = length;
}
}
internal class Person
{
[ StringLength ( 3 ) ]
public string name;
[ StringLength ( 10 ) ]
public string info;
}
internal class Man : Person
{
[ StringLength ( 3 ) ]
public string age;
}
internal class ValidationModel
{
public void Validate ( object obj)
{
var t = obj. GetType ( ) ;
var fieldInfos = t. GetFields ( ) ;
foreach ( var fieldInfo in fieldInfos)
{
if ( ! fieldInfo. IsDefined ( typeof ( StringLengthAttribute ) , true ) ) continue ;
var attributes = fieldInfo. GetCustomAttributes ( true ) ;
foreach ( var attribute in attributes)
{
var maxLength = ( int ) attribute. GetType ( ) . GetProperty ( "MaxLength" ) ?. GetValue ( attribute) ;
var fieldValue = fieldInfo. GetValue ( obj) as string ;
if ( fieldValue== null )
throw new Exception ( "String 未初始化" ) ;
if ( fieldValue. Length> maxLength)
throw new Exception ( $"字段 { fieldInfo. Name } 的值 { fieldValue } 的长度超过了 { maxLength } " ) ;
}
}
}
}
}
参考
传送门1 传送门2