public int Next(int celt, object[] rgVar, IntPtr pceltFetched) { if (celt == 1 && _enumerator.MoveNext()) { var current = _enumerator.Current; AutoWrap res = null; if (!((current == null) || !_type.IsAssignableFrom(current.GetType()))) { res = new AutoWrap(current, _type); ДанныеДляТипа.ПрописатьПоля(res, _данныеДляТипа); } rgVar[0] = res; if (pceltFetched != IntPtr.Zero) { Marshal.WriteInt32(pceltFetched, 1); } return(SOk); } else { return(SFalse); } }
internal static void ПрописатьПоля(AutoWrap объект, ДанныеДляТипа res) { объект.Поля = res._поля; объект.Мемберы = res._мемберы; объект.Методы = res._методы; объект.Свойства = res._свойства; }
public ТипизированныйЭнумератор(System.Collections.IEnumerator enumerator, Type тип) { this._enumerator = enumerator; _type = тип; _данныеДляТипа = ДанныеДляТипа.ПолучитьДанныеДляТипа(_type); }
internal static ДанныеДляТипа ПолучитьДанныеДляТипа(Type T) { if (!СловарьТипов.TryGetValue(T, out var res)) { res = new ДанныеДляТипа(T); СловарьТипов.Add(T, res); } return(res); }
internal static void Инициализировать(AutoWrap объект) { if (объект.ЭтоТип || объект.ЭтоExpandoObject) { return; } ДанныеДляТипа res = ПолучитьДанныеДляТипа(объект.T); ПрописатьПоля(объект, res); }