107 lines
3.4 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|