在特定文件夹中创建类的实例
本文关键字:实例 创建 文件夹 | 更新日期: 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);
}