我有 C# 代码,基础class A
并得出class B
:
public class A
{
public virtual void print() {Console.WriteLine("a"); }
}
public class B:A
{
public override void print() { Console.WriteLine("b"); }
}
static void Main(string[] args)
{
A a= new B();
//In c++ I can use .Base:: to call base method from derived class instance
a.Base::print();
}
我无法修改这两个类,而且我不知道在 C# 中可以做什么,有什么建议吗?
此外,感谢大家参与这次讨论,我想澄清为什么我需要这种行为:
在.net框架中,我们有一个接口IPostBack数据处理程序处理回发。里面有一个方法
public bool LoadPostData( string postDataKey, NameValueCollection postCollection )
当我实现它并测试时,我有时发现给定的回发类型收藏后 is 名称值集合,而其他时间则是Http值集合(派生类名称值集合)
那么,如果它是一种类型Http值集合,当我从中获取物品时,例如。postCollection['ControlID']我输入html在这个控制中,HttpValueCollection.get_item()将始终验证输入并将其视为缺陷。尽管NameValueCollection.get_item() won't
至少我不希望它自动进行验证I应该决定是否应该验证它,应该吗?
无法从派生类外部访问基方法。
您可以在派生类中编写一个方法来调用基方法,如下所示:
public class B : A
{
public override void print() { Console.WriteLine("B"); }
public void basePrint() { base.print(); }
}
或者您可以使用Reflection
获取基本方法定义并调用它,但它相当难看。
以下是创建方法DynamicMethod
调用基地print
method:
// Get MethodInfo of the base method
var methodInfo = typeof(A).GetMethod("Print", BindingFlags.Instance | BindingFlags.Public);
// Create DynamicMethod based on the methodInfo
var dynamicMethod = new DynamicMethod("BasePrint", methodInfo.ReturnType, new[] { methodInfo.DeclaringType }, methodInfo.DeclaringType);
// Create ILGenerator for the dynamic method
var il = dynamicMethod.GetILGenerator();
// Emit argument with index 0 - DeclaringType
il.Emit(OpCodes.Ldarg_0);
// Emit method call
il.EmitCall(OpCodes.Call, methodInfo, null);
// Emit method return value
il.Emit(OpCodes.Ret);
// Invoke method with target...
var b = new B();
dynamicMethod.Invoke(null, new object[] {b});
// ... or create a delegate and invoke method without target
var action = dynamicMethod.CreateDelegate(typeof(Action)) as Action;
action.Invoke();
注意它仅适用于无参数方法。如果你想调用带有参数的方法,你必须将它们的类型放入数组中DeclaringType
然后将它们全部发出。此外,您还必须创建类型的委托Action<parameterTypes
or Func<returnType, parameterTypes>
如果该方法返回一些东西。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)