有没有一种有效的方法可以对所有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
,则可以使用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();
}