2015-06-11 4 views
1

У меня есть два проекта, один является 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... 

     } 
    } 
+0

Вам нужно заново спроектировать его тогда. Если вы можете привести убедительный пример того, почему вы, возможно, должны это сделать, возможно, мы можем предложить другой способ приблизиться к нему. Как бы то ни было, ваш вопрос слишком расплывчатый. –

+1

Единственный способ создать контрактную сборку, определить в ней интерфейс, реализовать этот интерфейс по форме и передать ссылку этого интерфейса в библиотеку. Обе ваши текущие сборки могут ссылаться на эту контрактную сборку. –

+0

Yup. Вы пытаетесь создать круговую ссылку (и вообще круговую зависимость), что является ужасной идеей. Не делай этого. Почему * * вам когда-нибудь нужно было что-либо вызывать из проекта winforms в вашей библиотеке классов? – Luaan

ответ

4

Вы можете достичь этого путем введения 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... 

    } 
} 
+0

это влияет на производительность приложения? –

+0

@too_cool, короткий ответ: нет. Для более длительного ответа см. Http://stackoverflow.com/questions/2082735/performance-of-calling-delegates-vs-methods –

+0

Нет, вызов таких делегатов очень быстрый. – Enigmativity

3

Хотя метод обратного вызова от Давида является достаточным решением, если ваше взаимодействие становится более сложным, я хотел бы использовать этот подход

Создание inteface в классе libary

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

Перепишите код так, класс А ожидает, что это интерфейс 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; 
    } 
}