gpt4 book ai didi

c# - 如何在C#中从派生类实例调用基方法?

转载 作者:行者123 更新时间:2023-12-04 12:47:10 24 4
gpt4 key购买 nike

我有 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 framework 中,我们有一个接口(interface)IPostBackDataHandler 来处理回传。里面有一个方法

public bool LoadPostData( string postDataKey, NameValueCollection postCollection )

当我实现和测试时,我发现有时 postCollection 的给定回传类型是 NameValueCollection ,而其他时候是 HttpValueCollection (a NameValueCollection 的派生类)

然后,如果它是一种 HttpValueCollection,当我从中获取项目时,例如。 postCollection['ControlID'] 并且我在此控件中输入 htmlHttpValueCollection.get_item() 将始终验证输入并将其视为缺点。虽然 NameValueCollection.get_item() 不会

我不希望它自动运行验证,至少应该决定它是否应该被验证,我应该吗?

最佳答案

无法从派生类外部访问基方法。您可以在派生类中编写一个调用基方法的方法,如下所示:

public class B : A
{
public override void print() { Console.WriteLine("B"); }

public void basePrint() { base.print(); }
}

或者您可以使用 Reflection获取基本方法定义并调用它,但它相当丑陋。下面是如何创建 DynamicMethod调用 base print方法:

// 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 类型的委托(delegate)或 Func<returnType, parameterTypes>如果该方法返回某些内容。

关于c# - 如何在C#中从派生类实例调用基方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43797869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com