protected override void DoEmit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen) { if (_selectors.Count == 0) { throw new XamlLoadException("Invalid selector count", this); } if (_selectors.Count == 1) { _selectors[0].Emit(context, codeGen); return; } var listType = context.Configuration.TypeSystem.FindType("System.Collections.Generic.List`1") .MakeGenericType(base.Type.GetClrType()); var add = listType.FindMethod("Add", context.Configuration.WellKnownTypes.Void, false, Type.GetClrType()); codeGen .Newobj(listType.FindConstructor()); foreach (var s in _selectors) { codeGen.Dup(); context.Emit(s, codeGen, Type.GetClrType()); codeGen.EmitCall(add, true); } EmitCall(context, codeGen, m => m.Name == "Or" && m.Parameters.Count == 1 && m.Parameters[0].Name.StartsWith("IReadOnlyList")); }
public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen) { codeGen.Newobj(_constructor); codeGen .Dup() .Ldc_I4(_values.Count) .EmitCall(_listSetCapacityMethod); foreach (var value in _values) { codeGen.Dup(); context.Emit(value, codeGen, _elementType); codeGen.EmitCall(_listAddMethod); } return(XamlILNodeEmitResult.Type(0, Type.GetClrType())); }