ج#:كيفية الحصول على القيمة المخصصة من الإجراء؟

StackOverflow https://stackoverflow.com/questions/803331

  •  03-07-2019
  •  | 
  •  

سؤال

أستخدم الكود التالي لاستدعاء الخصائص والوصول إليها من خلال موضوع مختلف.

    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) وإذا كان الأمر كذلك، أضف " " إلى النص ("اختبار").

الفكرة هي الدعوة

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

بدلاً من

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

بمعنى آخر، أريد إضافة سطر جديد تلقائيًا إذا كان الإجراء هو "Richbox1.Text ="

كيف أفعل ذلك؟لم أعمل مع الإجراءات من قبل.

هل كانت مفيدة؟

المحلول

وماذا لو فعلتم:

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


public void UpdateTextBox(RichTextBox box,string text)
{

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

   box.AppendText(text);
}

ولديك لن تكون قادرة على نظرة من الداخل على العمل وتحديد انها تستخدم لcotnrol محددة من خارج العمل. لذلك إما أن تحتاج إلى إضافة \ ن قبل الاتصال PFA، أو أن يكون PFA استدعاء دالة التي سوف تفعل ما تريد، أو أن يكون PFA تنفيذ المنطق.

نصائح أخرى

يمكنك إضافة طريقة تمديد للقيام بالخدعة.حاول القيام بما يلي.

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

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

يحرر استخدم الأسلوب AppendText بدلاً من Text+=

وأنت لا تستطيع أن تفعل هذا بالطريقة التي تريدها. وظيفة PFA لا يمكن أن تحقق ما هو داخل المفوض. فكر كيف يمكنك حل مهمتك طريقة أخرى.

[offtopic]
ملاحظة. أيضا، اصطلاح التسمية ليست جيدة جدا. "PFA" لا يفسر ما تفعله وظيفة وأما "frmain" - عادة أسماء فئة تبدأ بحرف العاصمة
[/ offtopic]

و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;
}

هل يمكن تحقيق ذلك عن طريق الانتقال من عمل إلى التعبير>. ثم هل يمكن أن ننظر إلى ما يحدث في طريقة مثل ذلك

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)
}

وهذا يمنحك المعلومات التي تحتاجها لمعرفة الممتلكات، ولكن ليس في كيفية إلحاق \ ن. سأترك هذا متروك لكم لمعرفة ذلك. وأعتقد أن هذا هو مبالغة هنا، ولكن من يدري، ربما هذا يمكن أن يساعد أنت أو أي شخص آخر، أو حتى مصدر إلهام لحل لطيفة.

وهناك حل لطيفة وأنا ربما أفكر فيه حيث يمكن إعادة استخدام هذه الوظيفة هو بمثابة محرك القاعدة في الحالات التي يمكن مقارنة ما الملكية الذي يتم الوصول إليه هو وتشغيل العمل مباشرة بعد ذلك، وما إلى ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top