繁体   English   中英

如何从 c# 中的 class 库访问受保护的方法

[英]How to access Protected methods from a class library in c#

我有一个库,其中有一个受保护的方法,其定义如下:

public class InvokeCalc : IInvokeCalc
{

    protected InvokeCalc(OtherClass comm);
    public OtherClass();
    
}

我在我的 .net 核心 3.1 控制台应用程序中添加了这个库作为参考。
这是我写的:

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            SampleDAL dal = new SampleDAL();
            dal.Trigger();
        }
    }

public class SampleDAL 
    {
        IInvokeCalc app = null;            
        public async void Trigger()
        {  
            OtherClass comm = new OtherClass();          
            app = new InvokeCalc(comm);   // error        

            Console.ReadLine();

        }
    }
    

此代码引发错误说:

InvokeCalc.InvokeCalc(string) 由于其保护级别而无法访问。

我在其他一些答案中看到,如果我们继承 InvokeCalc class,我们可以使用它的受保护方法。
因此,我已将 SampleDAL 的定义更改为如下:

public class SampleDAL : InvokeCalc // Inherited InvokeCalc class
    {
        IInvokeCalc app = null;
        public async void Trigger()
        {            
            OtherClass comm = new OtherClass();          
            app = new InvokeCalc(comm);      

            Console.ReadLine();

        }
    }

这样做会产生一个额外的错误:

InvokeCalc 不包含采用 0 arguments 的构造函数。

现在我不确定如何进一步进行,在这种情况下的任何指导都会非常有帮助。

您绝对应该与作者讨论使用该 class。

也就是说,您缺少一个构造函数:

public class SampleDAL : InvokeCalc // Inherited InvokeCalc class
{
    public SampleDAL(OtherClass comm) : base(comm)
    {
    }

    IInvokeCalc app = null;

    public async Task Trigger()
    {
        OtherClass comm = new OtherClass();
        app = new SampleDAL(comm);
        await Task.CompletedTask;
        Console.ReadLine();
    }
}

这将编译,但它是否真的有效取决于基类的预期行为,以及OtherClass应该如何工作。

另请注意,您编写的代码不会编译 - public OtherClass(); 是不正确的。 我假设这是一个复制粘贴错误。

此外,您的Trigger()实现被声明为async Task但缺少任何等待,因此我放入了await Task.CompletedTask; . 我假设您的真实代码在该方法中有某种可等待的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM