在特定文件夹中创建类的实例

本文关键字:实例 创建 文件夹 | 更新日期: 2023-09-27 18:29:31

我有一个文件夹,里面有几个视图类(XAML文件)。现在我正在通过代码实例化这些:

engineRoomView = new EngineRoomView()
{
   DataContext = new ProcessViewModel()
};

然后再往下走:

item = new TabItem();
item.Contents = engineRoomView;
item.Name = "Engine Room";
views.Add(item);

我想要实现的是某种动态代码,用于在编程过程中在不了解它们的情况下,在特定文件夹中创建每个视图的一个实例。

如果开发人员将另一个xaml文件添加到该文件夹中。然后在运行时创建。

想象中的东西:

Foreach(file in folder)
{
   magicInstance = createInstanceFromFile(file);
   MainViewModel.addView(magicInstance);
}

这可能吗?

在特定文件夹中创建类的实例

如果我理解正确,这可以在Xaml Reader中的构建中存档。Xaml阅读器可以读取Xaml文件,并将基于Xaml生成对象。

看看这里:是否在运行时加载XAML?

听起来你有一个"父视图",你想为同一文件夹中的每个文件自动附加一个子视图。

如果每个文件夹中的类都有一个与文件夹结构一致的命名空间,则此代码应允许您在同一文件夹中创建每个类的实例列表,作为从基类继承的示例实例(也可以很容易地修改接口)。

static class NamespaceHelper 
{
    public static List<Type> FindTypesInSameNamespaceAs(object instance)
    {
        string ns = instance.GetType().Namespace;
        Type instanceType = instance.GetType();
        List<Type> results = instance.GetType().Assembly.GetTypes().Where(tt => tt.Namespace == ns &&
                                                                          tt != instanceType).ToList();
        return results;
    }
    public static List<T> InstantiateTypesInSameNamespaceAs<T>(object instance)
    {
        List<T> instances = new List<T>();
        foreach (Type t in FindTypesInSameNamespaceAs(instance))
        {
            if (t.IsSubclassOf(typeof(T)))
            {
                T i =(T) Activator.CreateInstance(t);
                instances.Add(i);
            }
        }
        return instances;
    }
}

只需调用NamespaceHelper.InstantiateTypesInSameNamespaceAs<YourBaseViewType>(instanceOfParentViewInSameFolder),循环查看结果,然后将它们添加到您的Parent中。

Foreach(ViewBase v in NamespaceHelper.InstantiateTypesInSameNamespaceAs<ViewBase>(this))
{
   MainViewModel.addView(v);
}