2010-07-06 2 views
-1

Я хотел бы передать ссылку переменной в класс, использовать ее, а затем вытащить ее позже.Как передать ссылку в класс

Что-то вроде этого:

// Create the comment Screen 
string newCommentText = ""; 
commentsScreen = new CommentEntry(this, ref newCommentText); 

commentScreen.ShowDialog(); 

... 

_dataLayer.SaveOffComment(newCommentText); 

А потом в комментариях класса:

public partial class CommentEntry : Form 
{ 
    public CommentEntry(Control pControl, ref string commentResult) 
    { 
     InitializeComponent(); 
     control = pControl; 

     // ***** Need a way for this to store the reference not the value. ***** 
     _commentResult = commentResult; 
    } 


    private string _commentResult; 

    private void CommentEntry_Closing(object sender, CancelEventArgs e) 
    { 
     _commentResult = tbCommentText.Text.Trim(); 
    } 
} 

Есть ли каким-то образом, что newCommentText может иметь значение, установленное в _commentResult в методе закрытия?

ПРИМЕЧАНИЕ. Ясно, что было бы легко просто установить переменную в моем классе и получить к ней доступ после ShowDialog. Этот пример является лишь приближением моей реальной проблемы и доступ к любым переменным в классе после завершения ShowDialog невозможен.

+2

Вы могли всегда переносите значение в класс. –

+1

Похоже, вы хотите указатель, а не ссылку. –

+0

Почему это невозможно? – Andy

ответ

2

Вы вообще не можете напрямую сохранить «ссылку на ссылку» в C#, но вы могли бы сделать что-то вроде этого:

public interface ICommented 
{ 
    string Comment { get; set; } 
} 

public class MyClass : ICommented 
{ 
    public string Comment { get; set; } 
} 

public partial class CommentEntry : Form 
{ 
    public CommentEntry(Control pControl, ICommented commented) 
    { 
     InitializeComponent(); 
     control = pControl; 

     // ***** Need a way for this to store the reference not the value. ***** 
     _commented = commented; 
    } 


    private ICommented _commented; 

    private void CommentEntry_Closing(object sender, CancelEventArgs e) 
    { 
     _commented.Comment = tbCommentText.Text.Trim(); 
    } 
} 

Так что теперь ваша форма может отредактировать комментарий любого класса, сказал, что знает, как прокомментировать.

+0

Это сработало отлично! Спасибо за идею. – Vaccano

0

Свойство newComment объекта CommentEntry.

+0

Как я сказал в примечании в конце моего вопроса, я не могу получить никаких переменных класса после ShowDialog – Vaccano

3

Это никогда не будет работать со строкой, поскольку они неизменяемы, и переменная изменится, указывая на новый экземпляр.

У вас есть два основных варианта. Первый заключается в том, чтобы просто получить getter для результата, чтобы его можно было получить, когда он понадобится позже. Другой вариант заключается в том, чтобы владелец передал метод делегата, который можно назвать передачей в результирующем значении. Затем владелец получит значение при закрытии комментария.

+0

Делегат - хорошее решение –

2

Как указал Дэн Брайант, вы не можете сделать это напрямую. Один из вариантов состоит в том, чтобы обернуть ссылку в класс, но для этого требуется написать много кода шаблона. Более простой вариант заключается в использовании делегатов и лямбда-функции (в C# 3.0) или анонимных делегатов (C# 2.0):

string newCommentText = ""; 
// Using lambda that sets the value of (captured) variable 
commentsScreen = new CommentEntry(this, newValue => { 
    newCommentText = newValue }); 
commentScreen.ShowDialog(); 
_dataLayer.SaveOffComment(newCommentText); 

Модифицированная версия CommentEntry формы будет выглядеть следующим образом:

public partial class CommentEntry : Form { 
    public CommentEntry(Control pControl, Action<string> reportResult) { 
    InitializeComponent(); 
    control = pControl; 
    // Store the delegate in a local field (no problem here) 
    _reportResult = reportResult;  
    } 

    private Action<string> _reportResult; 

    private void CommentEntry_Closing(object sender, CancelEventArgs e) { 
    // Invoke the delegate to notify the caller about the value 
    _reportResult(tbCommentText.Text.Trim()); 
    } 
} 
Смежные вопросы