【问题标题】:Calling "Form" class method from "A" class without adding a reference to the "Form" class从“A”类调用“Form”类方法而不添加对“Form”类的引用
【发布时间】:2015-08-27 04:33:32
【问题描述】:

我有两个项目,一个是 Winform 应用程序,另一个是 类库。我在Winform中添加了对类库的引用,并调用了类库的一个方法。现在我想从类库中调用 winform 应用程序中的不同方法,但我无法将 winform 的引用添加到类库中。

在代码中:-

public partial class Form1 : Form
    {
        private void btn_Click(object sender, EventArgs e)
        {
            A obj = new A();
            obj.foo();
        }
        public string Test(par)
        {
            //to_stuff
        }


    }

在类库中

 class A
    {
        public void foo()
        {
            //Do_stuff
            //...

            Test(Par);

            //Do...

        }
    }

【问题讨论】:

  • 你需要重新设计它。如果你能提供一个令人信服的例子来说明你为什么需要这样做,也许我们可以建议一种不同的方法来处理它。就目前而言,你的问题太模糊了。
  • 唯一的办法就是创建一个契约组件,在里面定义一个接口,通过表单实现这个接口,并将这个接口的引用传递给库。您当前的两个程序集都可以引用此合同程序集。
  • 是的。您正在尝试创建循环引用(以及一般的循环依赖项),这是一个糟糕的主意。不要这样做。为什么你需要从你的类库中的 winforms 项目中调用任何东西?
  • @Verarind,这是一种方式,但不是唯一的方式,例如看我的回答。
  • @DavidArno:是的,你是对的。您的解决方案也是一种可能的方式。但我们都犯了同样的错误。标题说他想调用Test(..) 而不添加对A 类的引用。希望他只是尽量避免引用库。类引用可能没问题。

标签: c# winforms methods class-library


【解决方案1】:

您可以通过将Test 注入class A 来实现此目的。

例如:

public partial class Form1 : Form
{
    private void btn_Click(object sender, EventArgs e)
    {
        A obj = new A();
        obj.foo(Test);
    }

    public string Test(string par)
    {
        //to_stuff
    }
}

class A
{
    public void foo(Func<string, string> callback)
        //Do_stuff
        //...

        if (callback != null)
        {
            callback(Par);
        }

        //Do...

    }
}

【讨论】:

  • @too_cool,简短的回答:不。如需更长的答案,请参阅stackoverflow.com/questions/2082735/…
  • 不,这样调用代表非常快。
  • @DavidArno - 不要忘记 null 检查回调。
  • @Enigmativity,好点子。我还修复了代码,因为通过构造函数注入会分散“使用委托”的答案。
  • @DavidArno Thx 的帮助。学到了很多..只是一个怀疑我可以将另一个表单传递给类,以便我可以访问其他表单属性或方法..抱歉延迟回复
【解决方案2】:

虽然 David 的回调方法是一个足够的解决方案,但如果您的交互变得更复杂,我会使用这种方法

在你的类库中创建一个接口

public interface ITester
{
    string Test(string value);
}

重写你的代码,让 A 类需要一个 ITester 接口

public class A
{
    public A(ITester tester)
    {
        this.tester = tester;
    }

    public string foo(string value)
    {
        return this.tester.Test(value);
    }        
}

在 Form1 中实现你的界面

public partial class Form1 : Form, ITester
{
    private void btn_Click(object sender, EventArgs e)
    {
        A obj = new A(this);
        obj.foo("test");
    }

    public string Test(string value)
    {
        //to_stuff
        return value;
    }
}

【讨论】:

    猜你喜欢
    • 2014-07-03
    • 1970-01-01
    • 2013-06-12
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2017-01-01
    相关资源
    最近更新 更多