コード例 #1
0
ファイル: MemberInfoX.cs プロジェクト: xlfj5211/esb
        /// <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]));
        }
コード例 #2
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;
                    }
                }
            }
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
ファイル: MemberInfoX.cs プロジェクト: xlfj5211/esb
        /// <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);
        }
コード例 #5
0
        /// <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);
        }
コード例 #6
0
        internal static void SetValue(Type type, Object target, String name, Object value)
        {
            if (type == null && target != null)
            {
                type = target.GetType();
            }
            if (type == null)
            {
                throw new ArgumentNullException("type");
            }
            if (String.IsNullOrEmpty(name))
            {
                throw new ArgumentNullException("name");
            }

            FieldInfoX fix = Create(type, name);

            if (fix == null)
            {
                throw new XException("类{0}中无法找到{1}字段!", type.Name, name);
            }

            fix.SetValue(target, value);
        }
コード例 #7
0
ファイル: FastTest.cs プロジェクト: xlfj5211/esb
        /// <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
        }
コード例 #8
0
 public override void SetValue(Object target, FieldInfo field, Object value)
 {
     FieldInfoX.Create(field).SetValue(target, value);
 }
コード例 #9
0
 public override Object GetValue(Object target, FieldInfo field)
 {
     return(FieldInfoX.Create(field).GetValue(target));
 }
コード例 #10
0
        /// <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));
            }
        }