有没有一种有效的方法可以对所有T类型的对象调用相同的方法

本文关键字:方法 类型 调用 对象 一种 有没有 有效 | 更新日期: 2023-09-27 18:26:22

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

但我不想这样做:

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

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

我有一个复杂的方法,需要在同一类型的几个控件上执行,我有大约25个控件。有没有更优雅的方法?非常感谢。

有没有一种有效的方法可以对所有T类型的对象调用相同的方法

如果列表中有所有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);
}

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

如果我要求有点太高,很抱歉,但还有更多吗将控件添加到列表中的优雅方式类似于++因为我所有的控件都命名为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);
}

我想我已经知道了如何以更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
{
}

您可以这样做:

List<TextBox> tbxList = new List<TextBox>()
{
    t1,
    t2,
    t3,
    t4
};
foreach (Textbox tbx in tbxList)
{
    CheckInputValue(tbx);
}

我想在前面的答案的基础上,让代码为你做这项工作,这样你就可以调用一个方法并获得你想要的结果:

您可以从textbox继承并添加一些功能,这些功能将具有textbox的所有特性,但也将添加到一个单独的列表中,以跟踪所有这些对象:

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