C# 如何在C中查找泛型控件的标记#

C# 如何在C中查找泛型控件的标记#,c#,winforms,generics,C#,Winforms,Generics,我正在创建一个函数,允许您通过标记搜索控件。唯一的参数是标记的名称。它返回带有标记的所有类型T控件的列表。这就是我所拥有的: public static List<T> FindWithTag<T>(string tag) { List<T> types = new List<T>(); foreach (T type in fm.Controls.OfType<T>()) if (type.Tag =

我正在创建一个函数,允许您通过标记搜索控件。唯一的参数是标记的名称。它返回带有标记的所有类型
T
控件的列表。这就是我所拥有的:

public static List<T> FindWithTag<T>(string tag)
{
    List<T> types = new List<T>();

    foreach (T type in fm.Controls.OfType<T>())
        if (type.Tag == tag)
            types.Add(type);
    return types;
}
公共静态列表FindWithTag(字符串标记)
{
列表类型=新列表();
foreach(fm.Controls.OfType()中的T类型)
if(type.Tag==Tag)
类型。添加(类型);
返回类型;
}
问题是,因为
T
是一个泛型变量,所以它没有标记属性。我能理解为什么,因为可能是
int
string
。如何告诉编译器
T
仅用于控件,因此会有一个标记


提前感谢。

您可以指定从中继承T类型的类型

public static T[] FindWithTag<T>(string tag) where T : Control
{
    List<T> types = new List<T>();

    foreach (T type in fm.Controls.OfType<T>())
        if (type.Tag == tag)
            types.Add(type);
    return types;
}

它也适用于
列表类型
,实际上,它是一个控件列表。有时,单个变量的名称不正确会使代码的可读性大大降低:)

您可以指定T类型应从中继承的类型

public static T[] FindWithTag<T>(string tag) where T : Control
{
    List<T> types = new List<T>();

    foreach (T type in fm.Controls.OfType<T>())
        if (type.Tag == tag)
            types.Add(type);
    return types;
}

它也适用于
列表类型
,实际上,它是一个控件列表。有时,单个变量的名称不正确会使代码的可读性大大降低:)

魔术搜索词是一个“魔术搜索词是一个”,有了这种类型限制,整个方法体可以变成
return fm.Controls.OfType()。其中(type=>type.Tag==Tag).ToArray()@YeldarKurmangaliyev哈哈,是的,当我输入它的时候,我觉得变量名可能有些混乱。但这很好用,谢谢你的帮助!:)使用该类型限制,整个方法体可以变成
return fm.Controls.OfType().Where(type=>type.Tag==Tag.ToArray()@YeldarKurmangaliyev哈哈,是的,当我输入它的时候,我觉得变量名可能有些混乱。但这很好用,谢谢你的帮助!:)