是否有一种在T类型的所有对象上调用相同方法的有效方法?

时间:2014-10-13 10:20:09

标签: c# windows-phone-8 methods repeat

假设我有10个TextBox,它们都有不同的值,但它们都是TextBoxes。而且,我有一个方法CheckInputValue(Textbox tb)。现在,点击一个按钮,我希望该方法检查所有文本框并确定是否允许该值。

但我不想这样做:

        void DoWork()
    {
        CheckInputValue(t1);
        CheckInputValue(t2);
        CheckInputValue(t3);
        CheckInputValue(t4);
        ...
        CheckInputValue(tx);

    }

请注意:以上只是一个例子。

我有一个复杂的方法需要在几个相同类型的控件上执行,我有大约25个控件。这样做有更优雅的方式吗? 谢谢。

5 个答案:

答案 0 :(得分:1)

如果列表中包含所有t,则可以使用List<T>.ForEach

listWithT.ForEach(CheckInputValue);

或者使用常规foreach

循环它们
foreach (T t in list)
{
    CheckInputValue(t);
}

或创建内联数组:

foreach (T t in new T[] { t1, t2, t3 })
{
    CheckInputValue(t);
}

如果没有,那就没有简单的方法了。

答案 1 :(得分:0)

你可以这样做:

List<TextBox> tbxList = new List<TextBox>()
{
    t1,
    t2,
    t3,
    t4
};

foreach (Textbox tbx in tbxList)
{
    CheckInputValue(tbx);
}

答案 2 :(得分:0)

  

对不起,如果我有点过于苛刻,但还有更多   将控件添加到列表中的优雅方式,如i ++   因为我的所有控件都被命名为i1,i2,i3 .... ix:S

你可以这样做(但它很脏):

int n_tbx = 5;
List<TextBox> tbxList = new List<TextBox>();

for (int i = 0; i < n_tbx; i++)
{
    //Where "this" is your mainframe
    tbxList.Add(this.Controls.Find("t"+i, true).FirstOrDefault() as TextBox);
}

foreach (Textbox tbx in tbxList)
{
    CheckInputValue(tbx);
}

答案 3 :(得分:0)

我想我已经知道如何让它变得更容易一些,并且采用更多的MVVM方式。它被简化了 - 没有属性更改报告,输入属性和东西..只是为了让你明白这一点。 因此,主要思想是您可以使用某种属性(在这种情况下为ValidateAttribute)标记应该验证的所有属性,并使用单个Validate方法,您可以收集所有属性并在一个位置验证它。

class SampleViewModel
{
    [Validate]
    public string SomeProperty { get; set; }

    [Validate]
    public string AnotherProperty { get; set; }

    public void Validate()
    {
        foreach (var propertyInfo in GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(p => p.IsDefined(typeof(ValidateAttribute), true)))
        {
            var value = propertyInfo.GetValue(this, null);
            Validate(value as string);
        }
    }

    private void Validate(string value)
    {
        if (string.IsNullOrEmpty(value))
        {
            // do something with the invalid input, i.e. throw the exception
        }
    }
}

class ValidateAttribute : Attribute
{
}

答案 4 :(得分:0)

我希望以前面的答案为基础,让您让代码为您完成工作,这样您就可以调用单个方法并获得所需的结果:

您可以从文本框继承并添加一些具有文本框所有特征的功能,但也会将自身添加到跟踪所有这些对象的单个列表中:

 public class CustomTextBox :TextBox
{
    private static List<CustomTextBox> CustomTextBoxList = new List<CustomTextBox>();

    public static async void ValidateAll()
    {
        foreach (CustomTextBox MyCustomTextBox in CustomTextBoxList)
        {
            ****PERFORM VALIDATION****
        }
    }

    public CustomTextBox ()
    {
        CustomTextBoxList.Add(this);
    }

    ~CustomTextBox()
    {
        CustomTextBoxList.Remove(this);
    }
}

将这些添加到您的XAML页面非常容易(抱歉,我不确定如何将XAML添加到这些答案中):

Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
  StackPanel
     local:CustomTextBox Text="A" Width="150" Margin="10"/
     local:CustomTextBox Text="B" Width="150" Margin="10"/
     local:CustomTextBox Text="C" Width="150" Margin="10"/
     local:CustomTextBox Text="D" Width="150" Margin="10"/
     local:CustomTextBox Text="E" Width="150" Margin="10"/
     Button Content="Validate TextBoxes!" Click="Button_Click"/
  /StackPanel
/Grid

单击该按钮时,它会调用一个函数,该函数将同时对所有这些函数执行验证:

private void Button_Click(object sender, RoutedEventArgs e)
{
   CustomTextBox.ValidateAll();
}