最近发现微软在命名枚举值有些技术,来深挖一下先定义窗体,加载窗体时候反射
//可以在添加一层来记录类型(type)防止不同类相同方法天剑不进去
private Dictionary<string, MethodInfo> AttributeMethodInfoDic = new Dictionary<string, MethodInfo>();
//通过反射获取TextClass类里的所有类实例和被标记的方法
private void Form1_Load(object sender, EventArgs e)
{
Assembly assembly = Assembly.LoadFile(Path.Combine(@"D:\站机程序备份\小功能测试\TextClass\bin\Debug", "TextClass.dll"));
Type[] types= assembly.GetTypes();
foreach (Type item in types)
{
if (null == item) continue;
MethodInfo[] methodinfos = item.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic); // BindingFlags.Instance |BindingFlags.NonPublic 可以获取类私有方法(什么参数都不加可以获取类的所有公有方法) 这个系统在定义枚举值也 很有特点?思考为啥不同枚举值可以用
//位运算符写上不同的枚举值就可以打上很多枚举值 如果有& 运算符呢 看最后小例子
foreach (MethodInfo itemMethod in methodinfos)
{
AttributeSqliteMark sqliteMark = null;
object[] customAttributeObjArry = itemMethod.GetCustomAttributes(typeof(ClassLibrary.AttributeSqliteMark), false);
foreach (object itemObj in customAttributeObjArry)
{
if (itemObj is AttributeSqliteMark)
{
sqliteMark = itemObj as AttributeSqliteMark;
if (sqliteMark.IsMatchAbility (EnumPeopleAbility.DriveCar )) //这里可以过滤这个函数时候具有改能力 经典
{
if (!AttributeMethodInfoDic.ContainsKey(sqliteMark.Name))
AttributeMethodInfoDic.Add(sqliteMark.Name, itemMethod);
}
}
}
}
}
}
private void button1_Click(object sender, EventArgs e)
{
object ret = AttributeMethodInfoDic["这是一个好函数"].Invoke(null, new object[] { Convert.ToInt32(textBox1.Text) });
MessageBox.Show(ret.ToString());
}
然后定义一个类 方法体上打上标签
public class TextClass
{
public const string Fun_说你好 = "这是一个好函数";
[AttributeSqliteMark(Fun_说你好 ,5,"123",EnumPeopleAbility.DriveAirplan|EnumPeopleAbility.DriveCar |EnumPeopleAbility.DriveTruk )] // 画龙点睛之笔
public static bool SayHellow(int temInt)
{
Console.Write("你好哈!");
return temInt > 5;
}
public void Say()
{ }
void Write()
{ }
}
最后来个枚举 特别注意这个IsMatchAbility 方法
public enum EnumPeopleAbility
{
DriveBike=1,
DriveCar=2,
DriveTruk=4,
DriveTrain=8,
DriveTank=16,
DriveAirplan=32,
DriveArtillery=64
}
public class AttributeSqliteMark : Attribute
{
public readonly string Name;
public readonly int Age;
public readonly string Dbtype;
public readonly EnumPeopleAbility Ability;
public AttributeSqliteMark(string Name, int Age, string Dbtype, EnumPeopleAbility Ability)
{
this.Name = Name;
this.Age = Age;
this.Dbtype = Dbtype;
this.Ability = Ability;
}
public bool IsMatchAbility(EnumPeopleAbility ability)
{
if ((this.Ability & ability) > 0 )
{
return true;
}
return false;
}
}
致辞全部结束 巧妙的运用了位 & 和 I 运算 ,可以收藏做个小技巧。