private MethodDefinition[] GetVirtualMethodDefsFromTypeDef(TypeDefinition typeDef)
{
var methods = new List<MethodDefinition>();
var declaredMethods = typeDef.Methods.Where(x => x.IsVirtual && !x.IsStatic && !x.DeclaringType.IsInterface).ToArray();
var nonOverrideMethods = new List<MethodDefinition>();
if (typeDef.BaseType != null)
{
var parentMethods = GetVirtualMethodDefsFromTypeDef(typeDef.BaseType.Resolve());
for (var i = 0; i < declaredMethods.Length; i++)
{
var declMethod = declaredMethods[i];
var overrided = false;
for (var j = 0; j < parentMethods.Length; j++)
{
var parentMethod = parentMethods[j];
if (parentMethod.Name == declMethod.Name /* && ... */)
{
parentMethods[j] = declMethod;
overrided = true;
break;
}
}
if (!overrided)
{
nonOverrideMethods.Add(declMethod);
}
}
methods.AddRange(parentMethods); // virtual (parent/override)
methods.AddRange(nonOverrideMethods); // virtual
}
else
{
methods.AddRange(declaredMethods); // virtual
}
return methods.ToArray();
}