将字符串变量传递给泛型<;T>;

本文关键字:lt gt 泛型 字符串 变量 | 更新日期: 2023-09-27 18:20:20

我有以下方法用于遍历可视化树以查找类型的所有对象:

    public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
    {
        if (depObj != null)
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                if (child != null && child is T)
                {
                    yield return (T)child;
                }
                foreach (T childOfChild in FindVisualChildren<T>(child))
                {
                    yield return childOfChild;
                }
            }
        }
    }

问题是Type是存储在veriable中的字符串值。当通过以下类型时,使用上面的操作很好:

var x = FindVisualChildren<TextBox>(this);

然而,在我的例子中,TextBox是一个存储在变量中的字符串,我们将称之为item。所以我想做这样的事情:

var item = "TextBox";
var x = FindVisualChildren<item>(this);

但是Item不是类型。那么,获取Sting变量的类型以便将其传递给我的方法的最佳方法是什么呢。变量将是TextBox、TextBlock、Grid、StackPanel、DockPanel或TabControl。现在我把所有的东西都放在Switch语句中,它正在工作,但我希望用一种更干净的方式来做同样的事情。

将字符串变量传递给泛型<;T>;

如注释中所述,您需要使用反射。

首先,您需要获得要使用的Type

你可以用两种方法来做。您可以从指定类型名称的字符串创建Type,如下所示:

var type_name = "System.Windows.Controls.TextBox, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35";
var type = Type.GetType(type_name, true);

或者你可以直接这样定义类型:

var type = typeof (TextBox);

然后你需要使用反射来获得MethodInfo,如下所示:

var method = typeof (StaticClass).GetMethod("FindVisualChildren", BindingFlags.Static | BindingFlags.Public);

其中,StaticClass是包含FindVisualChildren方法的静态类的名称。

然后你可以调用这样的方法:

IEnumerable result = (IEnumerable)method.MakeGenericMethod(type).Invoke(null, new object[] { this});

请注意,我选择的是IEnumerable,而不是IEnumerable<T>