Skip to content

Commit 7a3239d

Browse files
authored
Merge pull request EvilBeaver#1503 from Mr-Rm/v2/refl-1424
v2, к EvilBeaver#1424: исправлено получение свойств для Структур
2 parents 264a41d + 7f1689d commit 7a3239d

File tree

3 files changed

+55
-33
lines changed

3 files changed

+55
-33
lines changed

src/OneScript.StandardLibrary/Collections/FixedStructureImpl.cs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ public override int GetPropertyNumber(string name)
5757
return _structure.GetPropertyNumber(name);
5858
}
5959

60+
public override int GetPropCount()
61+
{
62+
return _structure.GetPropCount();
63+
}
64+
6065
public override BslMethodInfo GetMethodInfo(int methodNumber)
6166
{
6267
return _methods.GetRuntimeMethod(methodNumber);
@@ -163,21 +168,15 @@ private static FixedStructureImpl Constructor(StructureImpl structObject)
163168
[ScriptConstructor(Name = "По ключам и значениям")]
164169
public static FixedStructureImpl Constructor(IValue param1, IValue[] args)
165170
{
166-
var rawArgument = param1?.GetRawValue();
167-
if (rawArgument == null)
168-
return new FixedStructureImpl("");
169-
170-
if (rawArgument is BslStringValue s)
171-
{
172-
return new FixedStructureImpl((string)s, args);
173-
}
174-
else if (rawArgument is StructureImpl)
171+
return param1?.GetRawValue() switch
175172
{
176-
return new FixedStructureImpl(rawArgument as StructureImpl);
177-
}
173+
null => new FixedStructureImpl(""),
174+
BslStringValue s => new FixedStructureImpl((string)s, args),
175+
StructureImpl structure => new FixedStructureImpl(structure),
176+
177+
_ => throw new RuntimeException("В качестве параметра для конструктора можно передавать только Структура или Ключи и Значения")
178+
};
179+
}
178180

179-
throw new RuntimeException("В качестве параметра для конструктора можно передавать только Структура или Ключи и Значения");
180181
}
181-
182-
}
183182
}

src/OneScript.StandardLibrary/Collections/StructureImpl.cs

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,10 @@ public StructureImpl()
2828

2929
public StructureImpl(string strProperties, params IValue[] values)
3030
{
31-
var props = strProperties.Split(',');
32-
33-
for (int i = 0, nprop = 0; i < props.Length; i++)
31+
var nprop = 0;
32+
foreach (var item in strProperties.Split(','))
3433
{
35-
var prop = props[i].Trim();
34+
var prop = item.Trim();
3635
if (prop.Equals(string.Empty))
3736
continue;
3837

@@ -48,7 +47,7 @@ public StructureImpl(FixedStructureImpl structure)
4847
Insert(keyValue.Key.AsString(), keyValue.Value);
4948
}
5049
}
51-
50+
5251
[ContextMethod("Вставить")]
5352
public void Insert(string name, IValue val = null)
5453
{
@@ -65,7 +64,7 @@ public void Insert(string name, IValue val = null)
6564
{
6665
val = ValueFactory.Create();
6766
}
68-
67+
6968
SetPropValue(num, val);
7069
}
7170

@@ -133,6 +132,17 @@ public override string GetPropName(int propNum)
133132
return GetPropertyName(propNum);
134133
}
135134

135+
public override BslPropertyInfo GetPropertyInfo(int propNum)
136+
{
137+
return BslPropertyBuilder.Create()
138+
.Name(GetPropName(propNum))
139+
.CanRead(true)
140+
.CanWrite(true)
141+
.ReturnType(_values[propNum].GetType())
142+
.DeclaringType(GetType())
143+
.Build();
144+
}
145+
136146
public override BslMethodInfo GetMethodInfo(int methodNumber)
137147
{
138148
return _methods.GetRuntimeMethod(methodNumber);
@@ -243,20 +253,14 @@ private static StructureImpl Constructor(FixedStructureImpl fixedStruct)
243253
[ScriptConstructor(Name = "По ключам и значениям")]
244254
public static StructureImpl Constructor(IValue param1, IValue[] args)
245255
{
246-
var rawArgument = param1?.GetRawValue();
247-
if (rawArgument == null)
248-
return new StructureImpl();
249-
250-
if (rawArgument is BslStringValue s)
251-
{
252-
return new StructureImpl((string)s, args);
253-
}
254-
else if (rawArgument is FixedStructureImpl)
256+
return param1?.GetRawValue() switch
255257
{
256-
return new StructureImpl(rawArgument as FixedStructureImpl);
257-
}
258-
259-
throw new RuntimeException("В качестве параметра для конструктора можно передавать только ФиксированнаяСтруктура или Ключи и Значения");
258+
null => new StructureImpl(),
259+
BslStringValue s => new StructureImpl((string)s, args),
260+
FixedStructureImpl fixedstr => new StructureImpl(fixedstr),
261+
262+
_ => throw new RuntimeException("В качестве параметра для конструктора можно передавать только ФиксированнаяСтруктура или Ключи и Значения")
263+
};
260264
}
261265

262266

tests/reflector.os

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@
5454
ВсеТесты.Добавить("ТестДолжен_ПроверитьРефлексиюВнешнегоПараметра");
5555
ВсеТесты.Добавить("ТестДолжен_ПроверитьРефлексиюВнешнегоПараметраВРежимеПриватных");
5656

57+
ВсеТесты.Добавить("ТестДолжен_ПроверитьПолучитьТаблицуСвойствДляСтруктуры");
58+
ВсеТесты.Добавить("ТестДолжен_ПроверитьПолучитьТаблицуСвойствДляФиксированнойСтруктуры");
59+
5760
#Если Windows Тогда
5861
ВсеТесты.Добавить("ТестДолжен_ПроверитьВызовМетодаComОбъекта");
5962
#КонецЕсли
@@ -928,3 +931,19 @@
928931
юТест.ПроверитьИстину(ТаблицаСвойств[1].Экспорт);
929932

930933
КонецПроцедуры
934+
935+
Процедура ТестДолжен_ПроверитьПолучитьТаблицуСвойствДляСтруктуры() Экспорт
936+
Рефлектор = Новый Рефлектор;
937+
Структура = Новый Структура("Поле1, Поле2", -1, -2);
938+
Таблица = Рефлектор.ПолучитьТаблицуСвойств(Структура);
939+
юТест.ПроверитьРавенство(2, Таблица.Количество());
940+
юТест.ПроверитьНеРавенство(Неопределено, Таблица.Найти("Поле1"));
941+
КонецПроцедуры
942+
943+
Процедура ТестДолжен_ПроверитьПолучитьТаблицуСвойствДляФиксированнойСтруктуры() Экспорт
944+
Рефлектор = Новый Рефлектор;
945+
ФиксСтруктура = Новый ФиксированнаяСтруктура("Поле1, Поле2", -1, -2);
946+
Таблица = Рефлектор.ПолучитьТаблицуСвойств(ФиксСтруктура);
947+
юТест.ПроверитьРавенство(2, Таблица.Количество());
948+
юТест.ПроверитьНеРавенство(Неопределено, Таблица.Найти("Поле1"));
949+
КонецПроцедуры

0 commit comments

Comments
 (0)