public static Unit CreateUnit(string name) { var pure_unit_name = GetUnitName(name); if (!UnitFiles.ContainsKey(pure_unit_name)) { return(null); } var files = UnitFiles[pure_unit_name]; var ext = Path.GetExtension(name); if (!UnitTypes.ContainsKey(ext)) { return(null); } var type = UnitTypes[ext]; var descriptor = GetUnitDescriptor(pure_unit_name); var context = new UnitInstantiationContext(); context.Substitutions["p"] = pure_unit_name; context.Substitutions["P"] = StringEscaper.Unescape(pure_unit_name); context.Substitutions["f"] = "/" + StringEscaper.Unescape(pure_unit_name); context.Substitutions["H"] = Environment.MachineName; var unit_parameter = GetUnitParameter(name); if (string.IsNullOrEmpty(unit_parameter)) { unit_parameter = descriptor.DefaultInstance; } if (!string.IsNullOrEmpty(unit_parameter)) { context.Substitutions["i"] = unit_parameter; context.Substitutions["I"] = StringEscaper.Unescape(unit_parameter); context.Substitutions["f"] = "/" + StringEscaper.Unescape(unit_parameter); } descriptor.InstantiateDescriptor(context); return((Unit)Activator.CreateInstance(type, name, descriptor)); }
internal void InstantiateDescriptor(UnitInstantiationContext ctx) { var self_properties = this.GetType().GetProperties(); var properties_with_attribute = self_properties.Where(prop => prop.GetCustomAttributes(typeof(UnitPropertyAttribute), true).Any()); foreach (var property in properties_with_attribute) { switch (property.GetValue(this)) { case string str: property.SetValue(this, ctx.Substitute(str)); break; case List <string> list: for (int i = 0; i < list.Count; i++) { list[i] = ctx.Substitute(list[i]); } break; } } }