public static bool MethodsMatch(MethodInfo method1, MethodInfo method2)
        {
            #if ILSpy
            var md1 = method1.MemberReference as MethodDefinition;
            var md2 = method2.MemberReference as MethodDefinition;

            return md1.Name == md2.Name && ParametersMatch(md1, md2);
            #elif Reflector
            var md1 = method1.MemberReference as IMethodDeclaration;
            var md2 = method2.MemberReference as IMethodDeclaration;

            //return md1.Name == md2.Name && ParametersMatch(md1, md2);
            return method1.Text == method2.Text;
            #else

            return false;

            #endif
        }
        public MethodInfo Method(IMethodDeclaration method, TypeInfo type)
        {
            if (_methodCorrespondence.ContainsKey(method))
            {
                return _methodCorrespondence[method];
            }

            var methodInfo = new MethodInfo
            {
                Text = method.ToString(),
                Name = method.Name,
                FullName = method.Name,
                IsInternal = method.Visibility == MethodVisibility.Assembly,
                IsPrivate = method.Visibility == MethodVisibility.Private,
                IsPublic = method.Visibility == MethodVisibility.Public,
                IsProtected = method.Visibility == MethodVisibility.Family,
                IsProtectedAndInternal = method.Visibility == MethodVisibility.FamilyAndAssembly,
                IsProtectedOrInternal = method.Visibility == MethodVisibility.FamilyOrAssembly,
                IsVirtual = method.Virtual,
                IsOverride = method.Virtual && !method.NewSlot,
                IsSpecialName = method.SpecialName,
                IsStatic = method.Static,
                IsFinal = method.Final,
                MemberReference = method,
                DeclaringType = type
            };
            _methodCorrespondence.Add(method, methodInfo);

            if (method.Overrides.Count > 0)
            {
                var overridden = method.Overrides[0];
                var declaringType = overridden.DeclaringType as ITypeReference;
                if (declaringType.Resolve().Interface)
                {
                    methodInfo.IsOverride = false;
                }
            }

            int correction = methodInfo.Text.Contains(".ctor") || methodInfo.Text.Contains(".cctor") ? 0 : 1;
            methodInfo.Text = methodInfo.Text.Substring(methodInfo.Text.LastIndexOf('.') + correction);
            methodInfo.Name = methodInfo.Name.Substring(methodInfo.Name.LastIndexOf('.') + correction);

            methodInfo.Icon = Images.Images.GetMethodIcon(methodInfo);

            return methodInfo;
        }
 public MethodViewModel(MethodInfo methodInfo)
     : base(methodInfo)
 {
     _methodInfo = methodInfo;
 }
 private TypeViewModel GetTypeInAncestryWithMethod(MethodInfo methodInfo)
 {
     if (_methods.Any(m => Services.MethodsMatch(methodInfo, m.MemberInfo as MethodInfo)))
     {
         return this;
     }
     if (BaseType != null)
     {
         return BaseType.GetTypeInAncestryWithMethod(methodInfo);
     }
     throw new ArgumentException("No type with such method text in ancestry");
 }
        private MemberViewModel GetViewModelForMethod(MethodInfo methodInfo)
        {
            MemberViewModel vm;
            if (_viewModelsDictionary.ContainsKey(methodInfo))
            {
                var typeViewModel = GetViewModelForType(methodInfo.DeclaringType);
                vm = _viewModelsDictionary[methodInfo];
                vm.Background = typeViewModel.Background;
                vm.Foreground = typeViewModel.Foreground;
                return vm;
            }

            if (IsPropertyAccessor(methodInfo))
            {
                var propertyInfo = Helper.GetAccessorProperty(methodInfo.MemberReference);
                var typeViewModel = GetViewModelForType(propertyInfo.DeclaringType);

                if (_viewModelsDictionary.ContainsKey(propertyInfo))
                {
                    vm = _viewModelsDictionary[propertyInfo];
                    vm.Background = typeViewModel.Background;
                    vm.Foreground = typeViewModel.Foreground;
                    return vm;
                }
                var pvm = new PropertyViewModel(propertyInfo)
                {
                    Background = typeViewModel.Background,
                    Foreground = typeViewModel.Foreground,
                    ToolTip = typeViewModel.Name
                };
                _viewModelsDictionary.Add(propertyInfo, pvm);
                return pvm;
            }
            if (IsEventAccessor(methodInfo))
            {
                var eventInfo = Helper.GetAccessorEvent(methodInfo.MemberReference);
                var typeViewModel = GetViewModelForType(eventInfo.DeclaringType);
                if (_viewModelsDictionary.ContainsKey(eventInfo))
                {
                    vm = _viewModelsDictionary[eventInfo];
                    vm.Background = typeViewModel.Background;
                    vm.Foreground = typeViewModel.Foreground;
                    return vm;
                }
                var evm = new EventViewModel(eventInfo)
                {
                    Background = typeViewModel.Background,
                    Foreground = typeViewModel.Foreground,
                    ToolTip = typeViewModel.Name
                };
                _viewModelsDictionary.Add(eventInfo, evm);
                return evm;
            }

            var tvm = GetViewModelForType(methodInfo.DeclaringType);
            var mvm = new MethodViewModel(methodInfo)
            {
                Background = tvm.Background,
                Foreground = tvm.Foreground,
                ToolTip = tvm.Name
            };
            _viewModelsDictionary.Add(methodInfo, mvm);
            return mvm;
        }
 private IEnumerable<MethodInfo> FixDeclaringTypes(MethodInfo[] methods, TypeInfo[] types)
 {
     var fixedMethods = new List<MethodInfo>();
     var typeFullNames = types.Select(t => t.FullName).ToArray();
     foreach (var method in methods)
     {
         if (types.Contains(method.DeclaringType))
         {
             fixedMethods.Add(method);
             continue;
         }
         if (typeFullNames.Contains(method.DeclaringType.FullName))
         {
             var type = types.Single(t => t.FullName == method.DeclaringType.FullName);
             var realMethod = type.Methods.SingleOrDefault(m => m.MemberReference.ToString() == method.MemberReference.ToString());
             if (realMethod == null)
             {
                 realMethod = type.Accessors.Single(m => m.MemberReference.ToString() == method.MemberReference.ToString());
             }
             fixedMethods.Add(realMethod);
         }
     }
     return fixedMethods;
 }
 private static bool IsPropertyAccessor(MethodInfo method)
 {
     return (method.IsSpecialName
             && (method.Name.IndexOf("get_") != -1 || method.Name.IndexOf("set_") != -1));
 }
 private static bool IsEventAccessor(MethodInfo method)
 {
     return (method.IsSpecialName
             && (method.Name.IndexOf("add_") != -1 || method.Name.IndexOf("remove_") != -1));
 }