/// <summary>通过指定类型和成员名称,创建快速访问成员。按照属性、字段、构造、方法、事件的顺序</summary> /// <param name="type"></param> /// <param name="name"></param> /// <returns></returns> public static MemberInfoX Create(Type type, String name) { if (type == null || String.IsNullOrEmpty(name)) { return(null); } var mis = type.GetMember(name, DefaultBinding | BindingFlags.IgnoreCase); if (mis == null || mis.Length < 1) { //return null; // 基类的字段是无法通过这种方法得到的 return(FieldInfoX.Create(type, name)); } if (mis.Length == 1) { return(Create(mis[0])); } var ts = new MemberTypes[] { MemberTypes.Property, MemberTypes.Field, MemberTypes.Constructor, MemberTypes.Method, MemberTypes.Event }; foreach (var item in ts) { foreach (var mi in mis) { if (mi.MemberType == item) { return(Create(mi)); } } } return(Create(mis[0])); }
/// <summary>加载操作码</summary> static void LoadOpCodes() { if (singleByteOpCodes != null) { return; } singleByteOpCodes = new OpCode[0x100]; multiByteOpCodes = new OpCode[0x100]; foreach (var fi in typeof(OpCodes).GetFields()) { if (fi.FieldType == typeof(OpCode)) { OpCode code = (OpCode)FieldInfoX.Create(fi).GetValue(null); ushort index = (ushort)code.Value; if (index < 0x100) { singleByteOpCodes[(int)index] = code; } else { if ((index & 0xff00) != 0xfe00) { throw new InvalidOperationException("无效操作码"); } multiByteOpCodes[index & 0xff] = code; } } } }
/// <summary>尝试获取目标对象指定属性字段的值,返回是否成功</summary> /// <param name="target">目标对象</param> /// <param name="name"></param> /// <param name="value"></param> /// <returns></returns> public static Boolean TryGetValue(Object target, String name, out Object value) { if (target == null) { throw new ArgumentNullException("target"); } if (String.IsNullOrEmpty(name)) { throw new ArgumentNullException("name"); } value = null; //尝试匹配属性 PropertyInfoX property = PropertyInfoX.Create(target.GetType(), name); if (property != null) { value = property.GetValue(target); return(true); } //尝试匹配字段 FieldInfoX field = FieldInfoX.Create(target.GetType(), name); if (field != null) { value = field.GetValue(target); return(true); } return(false); }
/// <summary>创建快速访问成员</summary> /// <param name="member"></param> /// <returns></returns> public static MemberInfoX Create(MemberInfo member) { if (member == null) { return(null); } switch (member.MemberType) { case MemberTypes.All: break; case MemberTypes.Constructor: return(ConstructorInfoX.Create(member as ConstructorInfo)); case MemberTypes.Custom: break; case MemberTypes.Event: return(EventInfoX.Create(member as EventInfo)); case MemberTypes.Field: return(FieldInfoX.Create(member as FieldInfo)); case MemberTypes.Method: return(MethodInfoX.Create(member as MethodInfo)); case MemberTypes.Property: return(PropertyInfoX.Create(member as PropertyInfo)); case MemberTypes.TypeInfo: case MemberTypes.NestedType: return(TypeX.Create(member as Type)); default: break; } return(null); }
/// <summary>尝试设置目标对象指定属性字段的值,返回是否成功</summary> /// <param name="target">目标对象</param> /// <param name="name"></param> /// <param name="value"></param> /// <returns></returns> public static Boolean TrySetValue(Object target, String name, Object value) { //尝试匹配属性 PropertyInfoX property = PropertyInfoX.Create(target.GetType(), name); if (property != null) { property.SetValue(target, value); return(true); } //尝试匹配字段 FieldInfoX field = FieldInfoX.Create(target.GetType(), name); if (field != null) { field.SetValue(target, value); return(true); } return(false); }
/// <summary></summary> public static void Test() { XTrace.WriteLine("创建类型……"); #region TypeX类型 TypeX type = TypeX.Create(typeof(FastTest)); Object obj = type.CreateInstance(); Debug.Assert(obj != null, "创建实例出错!"); obj = type.CreateInstance(123); Debug.Assert(obj != null, "创建实例出错!"); //obj = type.CreateInstance("1234"); //Debug.Assert(obj != null, "创建实例出错!"); obj = type.CreateInstance(111, "aaa"); Debug.Assert(obj != null, "创建实例出错!"); XTrace.WriteLine("创建值类型实例"); type = TypeX.Create(typeof(ConsoleKeyInfo)); obj = type.CreateInstance(); Debug.Assert(obj != null, "创建值类型实例出错!"); XTrace.WriteLine("创建数组类型实例"); type = TypeX.Create(typeof(ConsoleKeyInfo[])); obj = type.CreateInstance(5); Debug.Assert(obj != null, "创建数组类型实例出错!"); #endregion #region 构造函数 ConstructorInfoX ctr = ConstructorInfoX.Create(typeof(FastTest)); obj = ctr.CreateInstance(); Debug.Assert(obj != null, "创建实例出错!"); ctr = ConstructorInfoX.Create(typeof(FastTest), new Type[] { typeof(Int32) }); obj = ctr.CreateInstance(123); Debug.Assert(obj != null, "创建实例出错!"); ctr = ConstructorInfoX.Create(typeof(FastTest), new Type[] { typeof(Int32), typeof(String) }); obj = ctr.CreateInstance(111, "aaa"); Debug.Assert(obj != null, "创建实例出错!"); #endregion #region 字段 FieldInfoX field = FieldInfoX.Create(typeof(FastTest), "_ID"); (obj as FastTest).ID = 111; Int32 v = (Int32)field.GetValue(obj); Debug.Assert(v == 111, "字段取值出错!"); field.SetValue(obj, 888); v = (Int32)field.GetValue(obj); Debug.Assert(v == 888, "字段赋值出错!"); KeyValuePair <Int32, Int32> kv = new KeyValuePair <int, int>(123456, 222); field = FieldInfoX.Create(kv.GetType(), "Key"); //field.SetValue(kv, 123456); v = (Int32)field.GetValue(kv); Debug.Assert(v == 123456, "字段取值出错!"); field = FieldInfoX.Create(typeof(FastTest), "_Name"); field.SetValue("动态赋值"); String v2 = (String)field.GetValue(); Debug.Assert(v2 == "动态赋值", "静态字段出错!"); #endregion #region 属性 PropertyInfoX p = typeof(FastTest).GetProperty("ID"); v = (Int32)p.GetValue(obj); Debug.Assert(v == 888, "属性取值出错!"); p.SetValue(obj, 999); v = (Int32)p.GetValue(obj); Debug.Assert(v == 999, "属性赋值出错!"); p = PropertyInfoX.Create(typeof(FastTest), "Name"); field.SetValue("属性动态赋值"); v2 = (String)field.GetValue(); Debug.Assert(v2 == "属性动态赋值", "静态字段出错!"); #endregion #region 方法 MethodInfoX method = MethodInfoX.Create(typeof(FastTest), "Test2"); method.Invoke(obj); method = typeof(FastTest).GetMethod("GetFullName"); Console.WriteLine(method.Invoke(null, 123, "abc")); #endregion }
public override void SetValue(Object target, FieldInfo field, Object value) { FieldInfoX.Create(field).SetValue(target, value); }
public override Object GetValue(Object target, FieldInfo field) { return(FieldInfoX.Create(field).GetValue(target)); }
/// <summary>获取方法在JIT编译后的地址(JIT Stubs)</summary> /// <remarks> /// MethodBase.DeclaringType.TypeHandle.Value: 指向该类型方法表(编译后)在 JIT Stubs 的起始位置。 /// Method.MethodHandle.Value: 表示该方法的索引序号。 /// CLR 2.0 SP2 (2.0.50727.3053) 及其后续版本中,该地址的内存布局发生了变化。直接用 "Method.MethodHandle.Value + 2" 即可得到编译后的地址。 /// </remarks> /// <param name="method"></param> /// <returns></returns> unsafe public static IntPtr GetMethodAddress(MethodBase method) { var isAboveNet2Sp2 = Environment.Version.Major >= 2 && Environment.Version.MinorRevision >= 3053; // 处理动态方法 if (method is DynamicMethod) { //byte* ptr = (byte*)GetDynamicMethodRuntimeHandle(method).ToPointer(); FieldInfo fieldInfo = typeof(DynamicMethod).GetField("m_method", BindingFlags.NonPublic | BindingFlags.Instance); byte * ptr = (byte *)((RuntimeMethodHandle)FieldInfoX.Create(fieldInfo).GetValue(method)).Value.ToPointer(); if (isAboveNet2Sp2) { // 确保方法已经被编译 RuntimeHelpers.PrepareMethod(method.MethodHandle); if (IntPtr.Size == 8) { return(new IntPtr((ulong *)*(ptr + 5) + 12)); } else { return(new IntPtr((uint *)*(ptr + 5) + 12)); } } else { if (IntPtr.Size == 8) { return(new IntPtr((ulong *)ptr + 6)); } else { return(new IntPtr((uint *)ptr + 6)); } } } // 确保方法已经被编译 RuntimeHelpers.PrepareMethod(method.MethodHandle); if (isAboveNet2Sp2) { return(new IntPtr((int *)method.MethodHandle.Value.ToPointer() + 2)); } // 要跳过的 var skip = 10; // 读取方法索引 var location = (UInt64 *)(method.MethodHandle.Value.ToPointer()); var index = (int)(((*location) >> 32) & 0xFF); // 区分处理x86和x64 if (IntPtr.Size == 8) { // 获取方法表 var methodTable = (ulong *)method.DeclaringType.TypeHandle.Value.ToPointer(); return(new IntPtr(methodTable + index + skip)); } else { // 获取方法表 var methodTable = (uint *)method.DeclaringType.TypeHandle.Value.ToPointer(); return(new IntPtr(methodTable + index + skip)); } }