Вызов метода базового класса игнорируя переопределенный метод в производном классе - C#
Формулировка задачи:
Как вызвать метод базового класса игнорируя переопределенный метод в производном классе.
PS переопределение метода в производном классе удалить нельзя, вшит в dll
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace ConsoleApplication1
- {
- public class Person
- {
- protected string ssn = "444-55-6666";
- protected string name = "John L. Malgraine";
- public virtual void GetInfo()
- {
- Console.WriteLine("Name: {0}", name);
- Console.WriteLine("SSN: {0}", ssn);
- }
- }
- class Employee : Person
- {
- public string id = "ABC567EFG";
- public override void GetInfo()
- {
- // Calling the base class GetInfo method:
- base.GetInfo();
- Console.WriteLine("Employee ID: {0}", id);
- }
- }
- class TestClass
- {
- static void Main()
- {
- Employee E = new Employee();
- E.GetInfo();
- Console.ReadKey();
- }
- }
- }
изменить тело классов базового и производного нельзя.
Решение задачи: «Вызов метода базового класса игнорируя переопределенный метод в производном классе»
textual
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Reflection.Emit;
- namespace System.Reflection
- {
- public static class MethodInfoExtensions
- {
- public static object InvokeNotOverride(this MethodInfo MethodInfo, object Object, params object[] Arguments)
- { // void return, this parameter
- var Parameters = MethodInfo.GetParameters();
- if (Parameters.Length == 0)
- {
- if (Arguments != null && Arguments.Length != 0) throw new Exception("The number of arguments does not match the number of parameters");
- }
- else {
- if (Parameters.Length != Arguments.Length) throw new Exception("The number of arguments does not match the number of parameters");
- }
- Type ReturnType = null;
- if (MethodInfo.ReturnType != typeof(void))
- {
- ReturnType = MethodInfo.ReturnType;
- }
- var Type = Object.GetType();
- var DynamicMethod = new DynamicMethod("", ReturnType, new Type[] { Type, typeof(Object) }, Type);
- var ILGenerator = DynamicMethod.GetILGenerator();
- ILGenerator.Emit(OpCodes.Ldarg_0); // this
- for (var i = 0; i < Parameters.Length; i++)
- {
- var Parameter = Parameters[i];
- ILGenerator.Emit(OpCodes.Ldarg_1); // load array argument
- // get element at index
- ILGenerator.Emit(OpCodes.Ldc_I4_S, i); // specify index
- ILGenerator.Emit(OpCodes.Ldelem_Ref); // get element
- var ParameterType = Parameter.ParameterType;
- if (ParameterType.IsPrimitive)
- {
- ILGenerator.Emit(OpCodes.Unbox_Any, ParameterType);
- }
- else if (ParameterType == typeof(object))
- {
- // do nothing
- }
- else {
- ILGenerator.Emit(OpCodes.Castclass, ParameterType);
- }
- }
- ILGenerator.Emit(OpCodes.Call, MethodInfo);
- var TestLabel = ILGenerator.DefineLabel();
- ILGenerator.Emit(OpCodes.Ret);
- return DynamicMethod.Invoke(null, new object[] { Object, Arguments });
- }
- }
- class Program
- {
- class BaseClass
- {
- public virtual void Test()
- {
- Console.WriteLine("Test() from BaseClass");
- }
- }
- class OverridingClass : BaseClass
- {
- public override void Test()
- {
- Console.WriteLine("Test() from OverridingClass");
- }
- }
- public static void Main()
- {
- var d = new OverridingClass();
- //typeof(BaseClass).GetMethod("Test").Invoke(d, null);
- typeof(BaseClass).GetMethod("Test").InvokeNotOverride(d, null);
- Console.ReadKey();
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д