/// <summary> /// конструктор /// </summary> /// <param name="ID"></param> /// <param name="returnType"></param> /// <param name="objStringedView"></param> /// <param name="objCaption"></param> /// <param name="objImagedView"></param> /// <param name="userViewFormat"></param> public FunctionDef(int ID, ObjectType returnType, string objStringedView, string objCaption, string userViewFormat) : base(returnType, objStringedView, objCaption) { fieldParameters = new DetailArrayOfFunctionalParameterDef(this); fieldUserViewFormat = userViewFormat; this.ID = ID; }
/// <summary> /// Разбор функции "по-косточкам" в специальный массив /// </summary> /// <param name="f">функция</param> /// <returns>new object[] { f.FunctionDef.ID, pars, types }</returns> public object FunctionToSimpleStruct(Function f) { var pars = new ArrayList(); var types = new ArrayList(); int parCount = f.Parameters.Count; DetailArrayOfFunctionalParameterDef functionalParameterDef = f.FunctionDef.Parameters; int fParDefCount = functionalParameterDef.Count; for (int i = 0; i < parCount; i++) { object par = f.Parameters[i]; if (par is Function) { types.Add("Func"); pars.Add(FunctionToSimpleStruct(par as Function)); } else if (par is VariableDef) { types.Add(par.GetType().AssemblyQualifiedName); pars.Add((par as VariableDef).ToSimpleValue()); } else { types.Add(null); FunctionParameterDef fpd = (i < fParDefCount) ? functionalParameterDef[i] : functionalParameterDef[fParDefCount - 1]; pars.Add(fpd.Type.ValueToSimpleValue(par)); } } return(new object[] { f.FunctionDef.ID, pars, types }); }
/// <summary> /// конструктор /// </summary> /// <param name="ID"></param> /// <param name="returnType"></param> /// <param name="objStringedView"></param> /// <param name="objCaption"></param> /// <param name="objImagedView"></param> /// <param name="userViewFormat"></param> /// <param name="parameters"></param> public FunctionDef(int ID, ObjectType returnType, string objStringedView, string objCaption, string userViewFormat, params FunctionParameterDef[] parameters) : base(returnType, objStringedView, objCaption) { fieldParameters = new DetailArrayOfFunctionalParameterDef(this); for (int i = 0; i < parameters.Length; i++) { fieldParameters.Add(parameters[i]); } fieldUserViewFormat = userViewFormat; this.ID = ID; }
/// <summary> /// Восстановление функции из простой структуры /// </summary> /// <param name="val"></param> /// <returns></returns> public Function FunctionFromSimpleStruct(object val) { var vals = (object[])val; var f = new Function(); f.FunctionDef = GetFunctionDef((int)vals[0]); var pars = (ArrayList)vals[1]; var types = (ArrayList)vals[2]; int count = pars.Count; DetailArrayOfFunctionalParameterDef functionalParameterDef = f.FunctionDef.Parameters; int fpdCount = functionalParameterDef.Count; for (int i = 0; i < count; i++) { object type = types[i]; object par = pars[i]; if (type == null) { FunctionParameterDef fpd = (i < fpdCount) ? functionalParameterDef[i] : functionalParameterDef[fpdCount - 1]; f.Parameters.Add(fpd.Type.SimpleValueToValue(par)); } else if ((string)type == "Func") { f.Parameters.Add(FunctionFromSimpleStruct(par)); } else { string stype = (string)type; // by fat // это из за того, что раньше адв лимит лежал отдельно, а сейчас в уи // для поддержки ранее созданных фильтров. Криво конечно, но что поделаешь... stype = stype.Replace("ICSSoft.STORMNET.Windows.Forms.AdvLimit", "ICSSoft.STORMNET.UI"); stype = stype.Replace("ICSSoft.STORMNET.UI, Version=1.0.0.1, Culture=neutral, PublicKeyToken=null", "ICSSoft.STORMNET.UI"); Type tp; try { tp = Tools.AssemblyLoader.GetTypeWithAssemblyName(stype); // Обеспечение обратной совместимости: в старых версиях в первую очередь сборку необходимо искать в другом месте. Type oldType = TryGetOldType(stype, false); if (oldType != null) { tp = oldType; } } catch (Exception) { if (stype.Contains(UilibraryName)) { /* Некоторые типы с пространством имён "ICSSoft.STORMNET.Windows.Forms" * были перенесены из сборки ICSSoft.STORMNET.UI в ExternalLangDef, * поэтому для обратной совместимости иногда может потребоваться следующий вызов. */ tp = Tools.AssemblyLoader.GetTypeWithAssemblyName( stype.Replace(UilibraryName, ExternalLangDefLibraryName)); } else if (stype.Contains(ExternalLangDefLibraryName)) { /* Данная конвертация сделана для обратной совместимости: * если подложить данную сборку в старую версию, то можно будет открывать ограничения в новом формате. */ tp = TryGetOldType(stype, true); } else { throw; } } var vd = (VariableDef)Activator.CreateInstance(tp); vd.FromSimpleValue(par, this); f.Parameters.Add(vd); } } return(f); }