XKRS2023Frm/XKRS.UI.Model.Winform/Helper/MenuFormFactory.cs
2023-03-24 17:02:04 +08:00

107 lines
3.4 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using XKRS.Common.Interface;
namespace XKRS.UI.Model.Winform.Helper
{
public static class MenuFormFactory
{
public static Dictionary<MenuNodeAttribute, Type> menuFrmTypeDict = null;
public static Dictionary<MenuNodeAttribute,Type> MenuFrmTypeDict
{
get
{
if (menuFrmTypeDict == null)
{
var assm = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory)
.GetFiles("*.dll")
.Where(fi =>
{
return fi.Name.StartsWith("XKRS");
})
.Select(u =>
{
try
{
return Assembly.LoadFrom(u.FullName);
}
catch { }
return null;
})
.Where(a => a != null)
.ToList();
assm.AddRange(AppDomain.CurrentDomain.GetAssemblies());
assm = assm.Distinct().ToList();
try
{
menuFrmTypeDict = assm.SelectMany(a => a.GetTypes())
.Where(t =>
{
if (t.GetInterfaces().Contains(typeof(IMenuNode)))
{
var attr = t.GetCustomAttribute<MenuNodeAttribute>();
return attr != null;
}
else
{
return false;
}
}).ToDictionary(t => t.GetCustomAttribute<MenuNodeAttribute>(), t => t);
}
catch(Exception ex)
{
throw ex;
}
}
return menuFrmTypeDict;
}
}
/// <summary>
/// 从Menu配置项转为窗口
/// </summary>
/// <param name="frmCode"></param>
/// <returns></returns>
public static MenuFormBase GetMenuFrm(string frmCode)
{
Type frmType = GetMenuFrmType(frmCode);
if (frmType == null)
{
return null;
}
var menuItem = Activator.CreateInstance(frmType);
if (menuItem == null)
{
return null;
}
var menu = menuItem as MenuFormBase;
if (menu == null)
{
return null;
}
menu.Tag = frmCode;
return menu;
}
public static Type GetMenuFrmType(string frmCode)
{
Type frmType = null;
foreach (KeyValuePair<MenuNodeAttribute,Type> pair in MenuFrmTypeDict)
{
if (pair.Key.MenuCode == frmCode)
{
frmType = pair.Value;
break;
}
}
return frmType;
}
}
}