110,548
社区成员
发帖
与我相关
我的任务
分享
/// <summary>
/// 判断某个事件是否添加
/// </summary>
/// <param name="obj"></param>
/// <param name="methordName"></param>
/// <returns></returns>
public bool HadAddEvent(object obj, string methordName)//Button使用
{
if (object.Equals(obj, null) || string.IsNullOrEmpty(methordName))
{
return false;
}
bool result = false;
//Person 这里拿Person测试
MyTest.SomPublicClass.Person p = (obj as MyTest.SomPublicClass.Person);
//if (p.ChangeName != null)//运行时候 调试可以这样的判断,编辑时候编译不通过
//{
// (p.ChangeName).Method.Name = methordName;
//}
EventInfo[] eventIn = obj.GetType().GetEvents();
foreach (var item in eventIn)
{
if (item.GetAddMethod() != null)
{
//Delegate de = null;
//de = new SomPublicClass.Person.ChangeNameDelete(pe_ChangeName); ;
//item.AddEventHandler(obj, de);
if (item.GetAddMethod().Name == methordName)
{
return true;
}
}
}
}
/// <summary>
/// 表示个人类,
/// </summary>
[Serializable]
public class Person : IComparable, ICloneable
{
#region 构造函数
public Person()
{
}
public Person(string id)
{
this.iD = id;
}
#endregion
#region 属性
/// <summary>
/// 学生改名事件
/// </summary>
public event ChangeNameDelete ChangeName;
public event EventHandler OtherEvent;
/// <summary>
///
/// </summary>
/// <param name="obj"></param>
/// <param name="list">名字的集合,list[0]是旧名字,list[1]是新名字</param>
public delegate void ChangeNameDelete(object obj, List<string> list);
public string other = "";
private string iD;
/// <summary>
/// 身份证号码
/// </summary>
public string ID
{
get { return iD; }
set { iD = value; }
}
}
class Program
{
static void Main(string[] args)
{
Person pe = new Person();
Person P = new Person();
P.ChangeName += new Person.ChangeNameDelete(pe_ChangeName);
bool Padd = HadAddEvent<Person>(P, "pe_ChangeName", "ChangeName");//希望返回为true
bool peadd = HadAddEvent<Person>(pe, "pe_ChangeName", "ChangeName");//希望返回为false
Console.WriteLine(Padd);
Console.WriteLine(peadd);
Console.Read();
}
private static bool HadAddEvent<T>(T instance, string methodName, string eventName = null)
{
EventInfo[] eventInfos = typeof(T).GetEvents();
if (eventInfos == null || eventInfos.Length == 0)
return false;
Type classType = typeof(T);
FieldInfo eventField = classType.GetField(eventName, BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);
Delegate method = (Delegate)eventField.GetValue(instance);
if (method == null)
return false;
return method.Method.Name.Equals(methodName);
}
private static void pe_ChangeName(object sender, List<string> list)
{
}
}