2009-04-29 3 views
1

Я использую следующий код для вызова и доступа к свойствам на моем из другого потока.C#: Как получить назначенное значение из действия?

public static void PFA(Action<frmain> action) 
    { 
     var form = Form.ActiveForm as frmain; 
     if (form != null) 
     { 
      form.PerformAction(action); 
     } 
    } 

    public void PerformAction(Action<frmain> action) 
    { 
     if (InvokeRequired) 
      Invoke(action, this); 
     else 
      action(this); 
    } 

Мой вопрос:

Если я называю PFA(form => form.Richbox1.Text = "Test") - Я хочу PFA(), чтобы проверить, если действие (Richbox1.Text), и если да, то добавить "\ п" к тексту ("Test «).

Идея заключается в том, чтобы позвонить

PFA(form => form.Richbox1.Text = "Test"); 

вместо

PFA(form => form.Richbox1.Text = "Test\n"); 

Другими словами, я хочу, чтобы добавить новую строку автоматически, если действие "Richbox1.Text ="

Как я это делаю? Раньше я никогда не работал с действиями.

ответ

1

Что делать, если вы сделали:

PFA(form => UpdateTextBox(form.Richbox1,"Test")); 


public void UpdateTextBox(RichTextBox box,string text) 
{ 

    if (box.Name=="Richbox1") 
    { 
     text+="\n"; 
    } 

    box.AppendText(text); 
} 

Ваш не будет способный заглянуть внутрь действия и определить, что он использует конкретный cotnrol извне действия. Поэтому либо вам нужно добавить \ n, прежде чем вы вызовете PFA, или попросите PFA вызвать функцию, которая будет делать то, что вы хотите, или PFA реализует логику.

1

Вы можете добавить метод расширения, чтобы сделать трюк. Попробуйте следующее.

public static void AddNewLineIfMatch(this RichTextBox rtb, string toMatch) { 
    if (rtb.Text == toMatch) { 
    rtb.AppendText("\n"); 
    } 
} 

PFDA(() => form.Richbox1.AddNewLineIfMatch("Test")); 

EDIT Используется метод AppendText вместо текста + =

+0

Я сожалею , вы меня неправильно поняли. «Тест» был всего лишь примером. Я все время добавляю в него текст, просто хочу добавить новую строку вместе с текстом и его не только один RichTextBox. –

1

Вы не можете сделать это так, как вы хотите. Функция PFA не может проверить, что находится внутри вашего делегата. Подумайте, как вы можете решить свою задачу по-другому.

[offtopic]
PS. Кроме того, ваше соглашение об именах не очень хорошо. «PFA» не объясняет, что делает функция, а что касается «frmain» - обычно имена классов начинаются с заглавной буквы.
[/ оффтоп]

UPDATE: Я хотел бы сделать это немного лучше, чем Джош предложил:

PFA(form => SetControlText(form.Richbox1, "Test")); 

public void SetControlText(Control control, string text) 
{ 
    control.Text = text; 
    // choose control type for which you want to add new line 
    if(control is RichTextbox || control is TextBox || control is ...) 
    control.Text += Environment.NewLine; 
}
+0

согласен с frmain, но PFA не так уж плох, потому что я предполагаю, что это PerformFormAction –

+0

PFA = PerformAction, frmain = FormMain. Можете ли вы предложить другой способ решить эту проблему? –

+1

Я думаю, что он говорит, что frmain будет более согласованным с рекомендуемыми соглашениями об именах, которые называются FormMain. –

0

Вы можете выполнить это, перейдя с Action на Expression>. Тогда вы можете посмотреть на то, что происходит в методе, как так

public static void PFA(Expression<Action<frmain>> expression) { 
    // this will give you form.RichTextBox1 
    var targetFormProperty = (MemberAccessExpression)expression.Body; 
    // this only works for your example given. this gives you RichTextBox1.Text 
    var textProperty = (MemberAccessExpression)targetFormProperty.Expression; 

    // this is how you would run your action like normal 
    var action = expression.Compile(); 
    action(); // invoke action (you would want to wrap this in the invoke check) 
} 

Это дает вам информацию вам нужно, чтобы выяснить, собственность, но не так, как для добавления \ п. Я оставлю это вам, чтобы узнать. Я думаю, что здесь слишком много, но кто знает, может быть, это может помочь вам или кому-то другому или даже вдохновить на хорошее решение.

хорошее решение я мог бы подумать о том, где вы могли бы повторно использовать эти функциональные возможности, как правило, двигатель, где вы можете сравнить то, что имущество осуществляется доступ является и запустить действие сразу после него, и т.д.