You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
189 lines
5.6 KiB
C#
189 lines
5.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Text;
|
|
using System.Reflection;
|
|
|
|
namespace Mesnac.Maths
|
|
{
|
|
public class Factory
|
|
{
|
|
#region 单例模式
|
|
private static Factory _this;
|
|
public static Factory Instance
|
|
{
|
|
get
|
|
{
|
|
if (null == _this)
|
|
_this = new Factory();
|
|
return _this;
|
|
}
|
|
}
|
|
private Factory()
|
|
{
|
|
this.AllMaths = new Dictionary<string, IMath>();
|
|
GetMaths();
|
|
}
|
|
#endregion
|
|
|
|
#region 属性
|
|
public Dictionary<string, IMath> AllMaths { get; set; }
|
|
#endregion
|
|
|
|
public string GetMethodName(string method)
|
|
{
|
|
string ss = method.Replace(" ", "");
|
|
if (ss.IndexOf("(") > 0)
|
|
{
|
|
return ss.Substring(0, ss.IndexOf("("));
|
|
}
|
|
return ss;
|
|
}
|
|
public string GetMethodParameter(string method)
|
|
{
|
|
string ss = method.Replace(" ", "");
|
|
if (ss.IndexOf("(") >= 0)
|
|
{
|
|
ss = ss.Substring(ss.IndexOf("(") + 1);
|
|
}
|
|
else
|
|
{
|
|
return string.Empty;
|
|
}
|
|
if (ss.IndexOf(")") >= 0)
|
|
{
|
|
return ss.Substring(0, ss.IndexOf(")"));
|
|
}
|
|
return ss;
|
|
}
|
|
|
|
public string[] GetParameters(string parameters)
|
|
{
|
|
List<string> Result = new List<string>();
|
|
string ss = parameters;
|
|
while (true)
|
|
{
|
|
string parameter = string.Empty;
|
|
if (ss.StartsWith("{"))
|
|
{
|
|
parameter = ss.Substring(0, ss.IndexOf("}") + 1).Trim();
|
|
ss = ss.Substring(ss.IndexOf("}") + 1).Trim();
|
|
}
|
|
else if (ss.StartsWith("["))
|
|
{
|
|
parameter = ss.Substring(0, ss.IndexOf("]") + 1).Trim();
|
|
ss = ss.Substring(ss.IndexOf("]") + 1).Trim();
|
|
}
|
|
else if (ss.StartsWith("("))
|
|
{
|
|
parameter = ss.Substring(0, ss.IndexOf(")") + 1).Trim();
|
|
ss = ss.Substring(ss.IndexOf(")") + 1).Trim();
|
|
}
|
|
else if (ss.StartsWith("<"))
|
|
{
|
|
parameter = ss.Substring(0, ss.IndexOf(">") + 1).Trim();
|
|
ss = ss.Substring(ss.IndexOf(">") + 1).Trim();
|
|
}
|
|
else if (ss.IndexOf(",") > 0)
|
|
{
|
|
parameter = ss.Substring(0, ss.IndexOf(",")).Trim();
|
|
ss = ss.Substring(ss.IndexOf(",") + 1).Trim();
|
|
}
|
|
else
|
|
{
|
|
parameter = ss.Replace(")", "").Replace(",", "");
|
|
ss = string.Empty;
|
|
}
|
|
if ((string.IsNullOrWhiteSpace(ss)) && (string.IsNullOrWhiteSpace(parameter)))
|
|
{
|
|
break;
|
|
}
|
|
if (string.IsNullOrWhiteSpace(parameter))
|
|
{
|
|
continue;
|
|
}
|
|
Result.Add(parameter);
|
|
}
|
|
return Result.ToArray();
|
|
}
|
|
public object Execute(string method, object[] buff)
|
|
{
|
|
string name = GetMethodName(method);
|
|
if (string.IsNullOrWhiteSpace(name))
|
|
{
|
|
if (buff.Length == 1)
|
|
{
|
|
return buff[0];
|
|
}
|
|
else
|
|
{
|
|
return buff;
|
|
}
|
|
}
|
|
string ps = GetMethodParameter(method);
|
|
IMath math = null;
|
|
this.AllMaths.TryGetValue(name, out math);
|
|
if (math != null)
|
|
{
|
|
return math.Execute(GetParameters(ps), buff);
|
|
}
|
|
if (buff.Length > 0)
|
|
{
|
|
if (buff.Length == 1)
|
|
{
|
|
return buff[0];
|
|
}
|
|
else
|
|
{
|
|
return buff;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private void GetMaths(FileInfo fi)
|
|
{
|
|
if (fi.Extension.ToLower() != ".dll")
|
|
{
|
|
return;
|
|
}
|
|
Assembly ass = Assembly.LoadFile(fi.FullName);
|
|
if (ass == null)
|
|
{
|
|
return;
|
|
}
|
|
Type[] types = ass.GetTypes();
|
|
foreach (Type t in types)
|
|
{
|
|
Type a = t.GetInterface(typeof(IMath).FullName);
|
|
if (a != null)
|
|
{
|
|
IMath m = (IMath)Activator.CreateInstance(t);
|
|
this.AllMaths.Add(m.Name, m);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void GetMaths()
|
|
{
|
|
string path = this.GetType().Assembly.Location;
|
|
//DirectoryInfo dir = new DirectoryInfo((new FileInfo(path)).Directory + "\\Mesnac.Maths\\");
|
|
DirectoryInfo dir = new DirectoryInfo((new FileInfo(path)).Directory + "\\Data\\DeviceConfig\\Mesnac.Maths\\");
|
|
|
|
FileInfo[] files = dir.GetFiles();
|
|
foreach (FileInfo fi in files)
|
|
{
|
|
try
|
|
{
|
|
GetMaths(fi);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ICSharpCode.Core.LoggingService.Error(ex.Message);
|
|
ICSharpCode.Core.LoggingService.Error(ex.StackTrace);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|