public void GetWholeChain_ReturnAllCrumbs_RelatedTo_Selected_One() { var crumbRoot = new Crumb(); //B var crumbB = new Crumb(); var crumbB_A = new Crumb(); var crumbB_B = new Crumb(); var crumbB_C = new Crumb(); var crumbB_C_A = new Crumb(); //C var crumbC = new Crumb(); crumbRoot.RegisterObserver(crumbB); crumbRoot.RegisterObserver(crumbC); crumbB.RegisterObserver(crumbB_A); crumbB.RegisterObserver(crumbB_B); crumbB_C.RegisterObserver(crumbB_C_A); crumbB.RegisterObserver(crumbB_C); //act var crumbChain = crumbB.GetWholeChain().ToArray(); Assert.Equal(6, crumbChain.Length); Assert.Contains(crumbRoot, crumbChain); Assert.Contains(crumbB, crumbChain); Assert.Contains(crumbB_A, crumbChain); Assert.Contains(crumbB_B, crumbChain); Assert.Contains(crumbB_C, crumbChain); Assert.Contains(crumbB_C_A, crumbChain); }
public void GetBranch_OK_WithNoRoot_AlsoSecondLineInheriting() { var crumbRoot = new Crumb(); //B var crumbB = new Crumb(); var crumbB_A = new Crumb(); var crumbB_B = new Crumb(); var crumbB_C = new Crumb(); var crumbB_C_A = new Crumb(); //C var crumbC = new Crumb(); crumbRoot.RegisterObserver(crumbB); crumbRoot.RegisterObserver(crumbC); crumbB.RegisterObserver(crumbB_A); crumbB.RegisterObserver(crumbB_B); crumbB_C.RegisterObserver(crumbB_C_A); crumbB.RegisterObserver(crumbB_C); //act var crumbBBranch = crumbB.GetBranch().ToArray(); var crumbCBranch = crumbC.GetBranch().ToArray(); Assert.Equal(5, crumbBBranch.Length); Assert.Contains(crumbB, crumbBBranch); Assert.Contains(crumbB_A, crumbBBranch); Assert.Contains(crumbB_B, crumbBBranch); Assert.Contains(crumbB_C, crumbBBranch); Assert.Contains(crumbB_C_A, crumbBBranch); Assert.Single(crumbCBranch); Assert.Contains(crumbC, crumbCBranch); }
public static Crumb GetCrumb() { Crumb result = new Crumb(); result.pos = new Vector3(pos.x, pos.y, pos.z); return(result); }
static async Task <Crumb> GetCrumb(HttpClient httpClient) { string endPoint = string.Format(GET_CRUMB_URI); HttpResponseMessage response = await httpClient.GetAsync(endPoint); if (!response.IsSuccessStatusCode) { return(null); } string responseContents = await response.Content.ReadAsStringAsync(); if (string.IsNullOrEmpty(responseContents)) { return(null); } Crumb crumb = new Crumb(); crumb.FieldName = XmlNodeLoader.LoadValue( responseContents, "/defaultCrumbIssuer/crumbRequestField"); crumb.Value = XmlNodeLoader.LoadValue( responseContents, "/defaultCrumbIssuer/crumb"); return(crumb); }
/// <summary> /// Returns true if DefaultCrumbIssuer instances are equal /// </summary> /// <param name="other">Instance of DefaultCrumbIssuer to be compared</param> /// <returns>Boolean</returns> public bool Equals(DefaultCrumbIssuer other) { if (other is null) { return(false); } if (ReferenceEquals(this, other)) { return(true); } return (( Class == other.Class || Class != null && Class.Equals(other.Class) ) && ( Crumb == other.Crumb || Crumb != null && Crumb.Equals(other.Crumb) ) && ( CrumbRequestField == other.CrumbRequestField || CrumbRequestField != null && CrumbRequestField.Equals(other.CrumbRequestField) )); }
private List <Crumb> GetCrumbs() { var crumbs = new List <Crumb>(); var homeCrumb = new Crumb { IsHome = true, Label = Dictionary.Home, ControllerName = "Home", ActionName = "Index", }; homeCrumb.IsActive = IsCrumbActive(homeCrumb); crumbs.Add(homeCrumb); crumbs.AddRange(_crumbs); if (!crumbs.Any(c => c.IsActive)) { var activeCrumb = new Crumb { Label = _viewContext.ViewBag.SubTitle ?? _viewContext.ViewBag.Title, ControllerName = GetActiveControllerName(), ActionName = GetActiveActionName(), IsActive = true }; crumbs.Add(activeCrumb); } return(crumbs); }
public void GetBranch_OK_WithNoRoot_OnlyFirstLineInheriting() { var crumbRoot = new Crumb(); //A var crumbA = new Crumb(); var crumbA_A = new Crumb(); var crumbA_B = new Crumb(); //C var crumbC = new Crumb(); crumbRoot.RegisterObserver(crumbA); crumbRoot.RegisterObserver(crumbC); crumbA.RegisterObserver(crumbA_A); crumbA.RegisterObserver(crumbA_B); //act var crumbABranch = crumbA.GetBranch().ToArray(); var crumbCBranch = crumbC.GetBranch().ToArray(); Assert.Equal(3, crumbABranch.Length); Assert.Contains(crumbA, crumbABranch); Assert.Contains(crumbA_A, crumbABranch); Assert.Contains(crumbA_B, crumbABranch); Assert.Single(crumbCBranch); Assert.Contains(crumbC, crumbCBranch); }
public void Assign_Observer() { var observerCrumb = new Crumb(); var broadcaster = new Crumb(); //act Assert.Empty(broadcaster.Observers); broadcaster.RegisterObserver(observerCrumb); Assert.Single(broadcaster.Observers); }
public static Crumb NextCrum(Crumb c) { if (crumbs.Contains(c)) { int i = crumbs.IndexOf(c); if (i < (crumbs.Count - 1)) { return(crumbs[i + 1]); } } return(GetCrumb()); }
public void ItReturnsBreadcrumbs() { // Arrange const string slug = "unit-test-showcase-crumbs"; var crumb = new Crumb("title", "slug", "type"); var collection = new ContentfulCollection <ContentfulShowcase>(); var rawShowcase = new ContentfulShowcaseBuilder().Slug(slug) .Breadcrumbs(new List <ContentfulReference>() { new ContentfulReference() { Title = crumb.Title, Slug = crumb.Title, Sys = new SystemProperties() { Type = "Entry" } }, }) .Build(); collection.Items = new List <ContentfulShowcase> { rawShowcase }; var builder = new QueryBuilder <ContentfulShowcase>().ContentTypeIs("showcase").FieldEquals("fields.slug", slug).Include(3); _contentfulClient.Setup(o => o.GetEntries(It.Is <QueryBuilder <ContentfulShowcase> >(q => q.Build() == builder.Build()), It.IsAny <CancellationToken>())) .ReturnsAsync(collection); _crumbFactory.Setup(o => o.ToModel(It.IsAny <ContentfulReference>())).Returns(crumb); var rawEvent = new ContentfulEventBuilder().Slug(slug).EventDate(new DateTime(2017, 4, 1)).Build(); var events = new List <ContentfulEvent> { rawEvent }; _cacheWrapper.Setup(o => o.GetFromCacheOrDirectlyAsync(It.Is <string>(s => s == "event-all"), It.IsAny <Func <Task <IList <ContentfulEvent> > > >(), It.Is <int>(s => s == 60))).ReturnsAsync(events); var modelledEvent = new Event("title", "event-slug", "", "", "", "", "", "", DateTime.MaxValue, "", "", 1, EventFrequency.None, null, "", null, new List <string>(), null, false, "", DateTime.MinValue, new List <string>(), null, null, new List <EventCategory> { new EventCategory("event", "slug", "icon") }, null, null, null, null); _eventFactory.Setup(e => e.ToModel(It.IsAny <ContentfulEvent>())).Returns(modelledEvent); // Act var response = AsyncTestHelper.Resolve(_repository.GetShowcases(slug)); // Assert response.StatusCode.Should().Be(HttpStatusCode.OK); var showcase = response.Get <Showcase>(); showcase.Breadcrumbs.First().Should().Be(crumb); }
public void AssignedObserver_IntoCrumb_Broadcast_Call_Receive() { var observerMock = new Mock <ICrumb>(); observerMock.Setup(o => o.Receive()); var broadcaster = new Crumb(); broadcaster.RegisterObserver(observerMock.Object); //act broadcaster.Broadcast(); observerMock.Verify(o => o.Receive(), Times.Once); }
protected void Page_Load(object sender, EventArgs e) { this.CurrentPath = Page.AppRelativeVirtualPath.Substring(1).Split('?')[0]; Crumb CurrentCrumb = Crumbs.Find(c => c.Page.Equals(CurrentPath)); this.CurrentCrumbs.Add(CurrentCrumb); while (CurrentCrumb.Previous != null) { CurrentCrumb = CurrentCrumb.Previous; this.CurrentCrumbs.Add(CurrentCrumb); } this.CurrentCrumbs.Reverse(); }
public int AddCrumb(string title, ICrumbViewContent content) { if (title == null) { throw new ArgumentNullException("Title"); } if (content == null) { throw new ArgumentNullException("Content"); } ICrumb crumb = new Crumb(title, content); return(AddCrumb(crumb)); }
protected override void OnPaint(PaintEventArgs e) { if (crumbList.Count > 0) { int uiOverheadLeft = 3; int uiOverheadRight = 13; int uiOverhead = uiOverheadLeft + uiOverheadRight; // Calc Control length int controlWidth = 0; for (int i = 0; i < crumbList.Count; i++) { int crumbIndex = crumbList.Count - 1 - i; Crumb crumb = crumbList[crumbIndex]; int textWidth = (int)e.Graphics.MeasureString(crumb.Text, Font).Width; controlWidth += textWidth + uiOverhead; //Vorne und hinten } int controlWidthUsed = controlWidth - uiOverheadRight; //Damit das erste Element bei X:0 gezeichnet wird for (int i = 0; i < crumbList.Count; i++) { int crumbIndex = crumbList.Count - 1 - i; Crumb crumb = crumbList[crumbIndex]; int textWidth = (int)e.Graphics.MeasureString(crumb.Text, Font).Width; if (crumbIndex == 0) { controlWidthUsed -= textWidth + uiOverhead; DrawControl(e, crumbIndex, controlWidthUsed + uiOverheadRight, textWidth + uiOverhead, crumb.Clicked, crumb.Hovered); DrawText(e, controlWidthUsed + uiOverhead, crumb.Text); } else { controlWidthUsed -= textWidth + uiOverhead; DrawControl(e, crumbIndex, controlWidthUsed, textWidth + uiOverhead + uiOverheadRight, crumb.Clicked, crumb.Hovered); DrawText(e, controlWidthUsed + uiOverhead, crumb.Text); } } } base.OnPaint(e); }
public override string ToString() { if (mTransitionHistory != null) { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < mTransitionHistory.Count; i++) { Crumb crumb = mTransitionHistory[i]; Transition obj = null; if (crumb.mSignal != null) { obj = crumb.mSignal.Transition; } stringBuilder.Append($"[{crumb.mTime}sec] state traverser '{mTraverser.GetSafeName()}' transitioning '{crumb.mStartState.GetSafeName()}'->'{crumb.mEndState.GetSafeName()}' using signal '{crumb.mSignal.GetSafeName()}' and transition '{obj.GetSafeName()}'\n"); } return(stringBuilder.ToString()); } return(string.Empty); }
/// <summary> /// Gets the hash code /// </summary> /// <returns>Hash code</returns> public override int GetHashCode() { unchecked // Overflow is fine, just wrap { var hashCode = 41; // Suitable nullity checks etc, of course :) if (Class != null) { hashCode = hashCode * 59 + Class.GetHashCode(); } if (Crumb != null) { hashCode = hashCode * 59 + Crumb.GetHashCode(); } if (CrumbRequestField != null) { hashCode = hashCode * 59 + CrumbRequestField.GetHashCode(); } return(hashCode); } }
public void GetWholeChain_ReturnCrumbsRelatedTo_Selected_WithNoSideOnes() { var crumbRoot = new Crumb() { Name = "root" }; //B var crumbB = new Crumb() { Name = "B" }; var crumbB_A = new Crumb() { Name = "B_A" }; var crumbB_B = new Crumb(); var crumbB_C = new Crumb(); var crumbB_C_A = new Crumb(); //C var crumbC = new Crumb(); crumbRoot.RegisterObserver(crumbB); crumbRoot.RegisterObserver(crumbC); crumbB.RegisterObserver(crumbB_A); crumbB.RegisterObserver(crumbB_B); crumbB_C.RegisterObserver(crumbB_C_A); crumbB.RegisterObserver(crumbB_C); //act var crumbChain = crumbB_A.GetWholeChain().ToArray(); Assert.Equal(3, crumbChain.Length); Assert.Contains(crumbRoot, crumbChain); Assert.Contains(crumbB, crumbChain); Assert.Contains(crumbB_A, crumbChain); }
private static void CreatePropertySetterDelegate(Builder builder, PropertyBuilderInfo member, Method propertySetter) { // If we don't have a backing field and we don't have a setter and getter // don't bother creating a setter delegate if (member.Property.BackingField == null && propertySetter == null) { return; } if (member.Property.BackingField == null && member.Property.Getter != null && member.Property.Setter != null) { var getter = member.Property.Getter.Copy(); var setter = member.Property.Setter.Copy(); CreateSetterDelegate(builder, propertySetter, member.Property.ReturnType, x => x.Call(getter.IsStatic ? null : Crumb.This, getter), (coder, value) => coder.Call(setter.IsStatic ? null : Crumb.This, setter, value())); } else if (member.Property.BackingField != null && !member.Property.BackingField.FieldType.IsGenericType) { CreateSetterDelegate(builder, propertySetter, member.Property.BackingField.FieldType, x => x.Load(member.Property.BackingField) as ICode, (coder, value) => coder.Assign(member.Property.BackingField).Set(value())); } else if (member.Property.BackingField == null && member.Property.Setter != null) { var methodSetter = member.Property.Setter.Copy(); propertySetter.NewCode().Call(methodSetter.IsStatic ? null : Crumb.This, methodSetter, Crumb.GetParameter(0)).Return().Replace(); } else if (member.Property.BackingField == null && member.Property.Getter != null) { // This shouldn't be a thing } else { propertySetter.NewCode().Assign(member.Property.BackingField).Set(Crumb.GetParameter(0)).Return().Replace(); } }
public void ShouldCreateAGroupFromAContentfulGroup() { // Arrange var crumb = new Crumb("Stockport Local", string.Empty, "groups"); var category = new GroupCategory("name", "slug", "icon", "imageUrl"); var administrators = new GroupAdministrators { Items = new List <GroupAdministratorItems> { new GroupAdministratorItems { Name = "Name", Email = "Email", Permission = "admin" } } }; var mapPosition = new MapPosition { Lat = 39, Lon = 2 }; var subCategories = new List <GroupSubCategory> { new GroupSubCategory("name", "slug") }; var organisation = new Organisation { Title = "Org" }; var suitableFor = new List <string> { "people" }; var document = new DocumentBuilder().Build(); _documentFactory.Setup(_ => _.ToModel(It.IsAny <Asset>())).Returns(document); _contentfulGroupCategoryFactory.Setup(_ => _.ToModel(It.IsAny <ContentfulGroupCategory>())) .Returns(category); _contentfulGroupSubCategoryFactory.Setup(_ => _.ToModel(It.IsAny <ContentfulGroupSubCategory>())) .Returns(subCategories.First()); _contentfulOrganisationFactory.Setup(_ => _.ToModel(It.IsAny <ContentfulOrganisation>())) .Returns(organisation); // Act var result = _groupContentfulFactory.ToModel(_contentfulGroup); // Assert result.AbilityLevel.Should().Be(""); result.AccessibleTransportLink.Should().Be("link"); result.AdditionalDocuments.Count.Should().Be(1); result.AdditionalDocuments.First().Should().BeEquivalentTo(document); result.AdditionalInformation.Should().Be("info"); result.Address.Should().Be("_address"); result.AgeRange.Count.Should().Be(1); result.AgeRange.First().Should().BeEquivalentTo("15-20"); result.Breadcrumbs.Count.Should().Be(1); result.Breadcrumbs.First().Should().BeEquivalentTo(crumb); result.CategoriesReference.Count.Should().Be(1); result.CategoriesReference.First().Should().BeEquivalentTo(category); result.Cost.Count.Should().Be(1); result.CostText.Should().Be(""); result.DateHiddenFrom.Should().Be(DateTime.MinValue); result.DateHiddenTo.Should().Be(DateTime.MinValue); result.DateLastModified.Should().Be(DateTime.MinValue); result.Email.Should().Be("_email"); result.Description.Should().Be("_description"); result.Donations.Should().BeFalse(); result.DonationsText.Should().Be("donText"); result.DonationsUrl.Should().Be("donUrl"); result.ImageUrl.Should().Be("image-url.jpg"); result.GroupAdministrators.Should().BeEquivalentTo(administrators); result.MapPosition.Should().BeEquivalentTo(mapPosition); result.Name.Should().Be("_name"); result.Slug.Should().Be("_slug"); result.PhoneNumber.Should().Be("_phoneNumber"); result.Website.Should().Be("_website"); result.Twitter.Should().Be("_twitter"); result.Facebook.Should().Be("_facebook"); result.Volunteering.Should().Be(true); result.VolunteeringText.Should().Be("text"); result.SubCategories.Should().BeEquivalentTo(subCategories); result.Status.Should().Be("Published"); result.Organisation.Should().BeEquivalentTo(organisation); result.SuitableFor.Should().BeEquivalentTo(suitableFor); result.MetaDescription.Should().Be("_metaDescription"); }
private void InterceptConstructors(Builder builder, IEnumerable <BuilderType> attributes) { if (!attributes.Any()) { return; } using (new StopwatchLog(this, "constructor")) { var iConstructorInterceptor = new __IConstructorInterceptor(); var syncRoot = new __ISyncRoot(); var exception = new __Exception(); var constructors = builder .FindMethodsByAttributes(attributes) .Where(x => !x.Method.OriginType.IsInterface) .GroupBy(x => new MethodKey(x.Method, null)) .Select(x => new MethodBuilderInfo <MethodBuilderInfoItem <__IConstructorInterceptor> >(x.Key, x.Select(y => new MethodBuilderInfoItem <__IConstructorInterceptor>(y, iConstructorInterceptor)))) .ToArray(); foreach (var constructor in constructors) { this.Log($"Implementing constructors in method {constructor.Key.Method}"); if (constructor.Item == null || constructor.Item.Length == 0) { continue; } var targetedConstrutor = constructor.Key.Method; if (constructor.RequiresSyncRootField) { this.Log(LogTypes.Warning, targetedConstrutor, $"An interceptor applied to the constructor has implemented ISyncRoot. This is not supported. The interceptor may not work correctly."); } Crumb parametersArray = null; var localVariables = new LocalVariable[constructor.Item.Length]; var interceptorInit = new Action <ICode, bool>((contextCoder, isBeforeInit) => { parametersArray = contextCoder.GetParametersArray(); for (int i = 0; i < constructor.Item.Length; i++) { var item = constructor.Item[i]; localVariables[i] = contextCoder.CreateVariable(item.Attribute.Attribute.Type); contextCoder.Assign(localVariables[i]).NewObj(item.Attribute); ImplementAssignMethodAttribute(builder, item.AssignMethodAttributeInfos, localVariables[i], contextCoder, isBeforeInit); contextCoder.Load(localVariables[i]).As(item.Interface.ToBuilderType) .Call(item.Interface.OnBeforeInitialization, targetedConstrutor.OriginType, targetedConstrutor, parametersArray); item.Attribute.Remove(); } }); if (targetedConstrutor.IsCtor) { targetedConstrutor.NewCode() .Context(x => interceptorInit(x, true)) .Insert(InsertionPosition.CtorBeforeInit); } targetedConstrutor.NewCode() .Context(x => { if (targetedConstrutor.IsCCtor) { interceptorInit(x, false); } }) .Try(x => { for (int i = 0; i < constructor.Item.Length; i++) { var item = constructor.Item[i]; x.Load(localVariables[i]).As(item.Interface.ToBuilderType) .Call(item.Interface.OnEnter, targetedConstrutor.OriginType, Crumb.This, targetedConstrutor, parametersArray); } x.OriginalBody(); }) .Catch(exception.ToBuilderType, x => { if (constructor.Key.AsyncMethod == null) { for (int i = 0; i < constructor.Item.Length; i++) { x.Load(localVariables[i]).As(constructor.Item[i].Interface.ToBuilderType).Call(constructor.Item[i].Interface.OnException, x.Exception); } } x.Rethrow(); }) .Finally(x => { for (int i = 0; i < constructor.Item.Length; i++) { x.Load(localVariables[i]).As(constructor.Item[i].Interface.ToBuilderType).Call(constructor.Item[i].Interface.OnExit); } }) .EndTry() .Return() .Replace(); } } }
private void SetCrumb() { crumbing=false; pvis = true; crumb = PlayerCharacter.GetCrumb(); }
private string ToInactiveHtmlElement(Crumb crumb) => String.Format(_template, crumb.Url, crumb.Name);
public void ShouldCreateATopicFromAContentfulTopic() { //Arrange var crumb = new Crumb("title", "slug", "type"); _crumbFactory.Setup(_ => _.ToModel(_contentfulTopic.Breadcrumbs.First())).Returns(crumb); var subItem = new SubItem("slug1", "title", "teaser", "icon", "type", DateTime.MinValue, DateTime.MaxValue, "image", new List <SubItem>()); _subItemFactory.Setup(_ => _.ToModel(_contentfulTopic.SubItems.First())).Returns(subItem); var secondaryItem = new SubItem("slug2", "title", "teaser", "icon", "type", DateTime.MinValue, DateTime.MaxValue, "image", new List <SubItem>()); _subItemFactory.Setup(_ => _.ToModel(_contentfulTopic.SecondaryItems.First())).Returns(secondaryItem); var tertiaryItem = new SubItem("slug3", "title", "teaser", "icon", "type", DateTime.MinValue, DateTime.MaxValue, "image", new List <SubItem>()); _subItemFactory.Setup(_ => _.ToModel(_contentfulTopic.TertiaryItems.First())).Returns(tertiaryItem); var eventBanner = new EventBanner("Title", "Teaser", "Icon", "Link"); _eventBannerFactory.Setup(_ => _.ToModel(_contentfulTopic.EventBanner)).Returns(eventBanner); var alert = new Alert("title", "subheading", "body", "test", new DateTime(2017, 01, 01), new DateTime(2017, 04, 10), string.Empty, false); _alertFactory.Setup(_ => _.ToModel(_contentfulTopic.Alerts.First())).Returns(alert); var expandingLinkBox = new ExpandingLinkBox("title", new List <SubItem>()); _expandingLinkBoxFactory.Setup(_ => _.ToModel(It.IsAny <ContentfulExpandingLinkBox>())) .Returns(expandingLinkBox); //Act var result = _topicContentfulFactory.ToModel(_contentfulTopic); //Assert result.SubItems.Count().Should().Be(1); result.SubItems.First().Should().BeEquivalentTo(subItem); result.SecondaryItems.Count().Should().Be(1); result.SecondaryItems.First().Should().BeEquivalentTo(secondaryItem); result.TertiaryItems.Count().Should().Be(1); result.TertiaryItems.First().Should().BeEquivalentTo(tertiaryItem); result.EventBanner.Should().BeEquivalentTo(eventBanner); result.Alerts.Count().Should().Be(1); result.Alerts.First().Should().BeEquivalentTo(alert); result.BackgroundImage.Should().BeEquivalentTo("background-image-url.jpg"); result.Breadcrumbs.Count().Should().Be(1); result.Breadcrumbs.First().Should().BeEquivalentTo(crumb); result.EmailAlerts.Should().Be(false); result.EmailAlertsTopicId.Should().BeEquivalentTo("id"); result.ExpandingLinkBoxes.Count().Should().Be(1); result.ExpandingLinkBoxes.First().Should().BeEquivalentTo(expandingLinkBox); result.ExpandingLinkTitle.Should().BeEquivalentTo("expandingLinkTitle"); result.Icon.Should().BeEquivalentTo("icon"); result.Image.Should().BeEquivalentTo("background-image-url.jpg"); result.Slug.Should().BeEquivalentTo("slug"); result.Name.Should().BeEquivalentTo("name"); result.Summary.Should().BeEquivalentTo("summary"); result.SunriseDate.Should().Be(DateTime.MinValue); result.SunsetDate.Should().Be(DateTime.MaxValue); result.Teaser.Should().BeEquivalentTo("teaser"); result.MetaDescription.Should().BeEquivalentTo("metaDescription"); result.DisplayContactUs.Should().Be(false); }
private static void CreateSetterDelegate(Builder builder, Method setterDelegateMethod, BuilderType propertyType, Func <ICode, ICode> loadValue, Func <ICode, Func <object>, ICode> setValue) { var extensions = new __Extensions(); var iList = new __IList(); var setterCode = setterDelegateMethod.NewCode(); if (propertyType.ParameterlessContructor != null && propertyType.ParameterlessContructor.IsPublic) { loadValue(setterCode).IsNull().Then(y => setValue(y, () => setterCode.NewCode().NewObj(propertyType.ParameterlessContructor))); } // Only this if the property implements idisposable if (propertyType.Implements(typeof(IDisposable))) { setterCode.Call(extensions.TryDisposeInternal, loadValue(setterCode.NewCode())); } setterCode.Load(Crumb.GetParameter(0)).IsNull().Then(x => { // Just clear if its clearable if (propertyType.Implements(__IList.Type.Fullname)) { loadValue(x).Callvirt(iList.Clear).Return(); } // Otherwise if the property is not a value type and nullable else if (!propertyType.IsValueType || propertyType.IsNullable || propertyType.IsArray) { setValue(x, () => null).Return(); } else // otherwise... throw an exception { x.ThrowNew(typeof(NotSupportedException), "Value types does not accept null values."); } }); if (propertyType.IsArray) { setterCode.Load(Crumb.GetParameter(0)).Is(typeof(IEnumerable)) .Then(x => setValue(x, () => Crumb.GetParameter(0)).Return()) .ThrowNew(typeof(NotSupportedException), "Value does not inherits from IEnumerable"); } else if (propertyType.Implements(__IList.Type.Fullname) && propertyType.ParameterlessContructor != null) { var addRange = propertyType.GetMethod("AddRange", 1, false); if (addRange == null) { var add = propertyType.GetMethod("Add", 1); var array = setterCode.CreateVariable(propertyType.ChildType.MakeArray()); setterCode.Assign(array).Set(Crumb.GetParameter(0)); setterCode.For(array, (x, item) => loadValue(x).Callvirt(add, item)); if (!add.ReturnType.IsVoid) { setterCode.Pop(); } } else { loadValue(setterCode).Callvirt(addRange, Crumb.GetParameter(0)); } } else if (propertyType.IsEnum) { // Enums requires special threatment setterCode.Load(Crumb.GetParameter(0)).Is(typeof(string)).Then(x => { var stringVariable = setterCode.CreateVariable(typeof(string)); setterCode.Assign(stringVariable).Set(Crumb.GetParameter(0)); setValue(setterCode, () => stringVariable).Return(); }); setValue(setterCode, () => Crumb.GetParameter(0)); } else { setValue(setterCode, () => Crumb.GetParameter(0)); } setterCode.Return().Replace(); }
private static void AddPropertySetterInterception(Builder builder, __PropertyInterceptionInfo propertyInterceptionInfo, PropertyBuilderInfo member, Field propertyField, Method actionObjectCtor, Method propertySetter, Dictionary <string, Field> interceptorFields) { var syncRoot = new __ISyncRoot(); var legalSetterInterceptors = member.InterceptorInfos.Where(x => x.InterfaceSetter != null).ToArray(); member.Property.Setter .NewCode() .Context(x => { if (member.HasInitializer) { return; } for (int i = 0; i < legalSetterInterceptors.Length; i++) { var item = legalSetterInterceptors[i]; var field = interceptorFields[item.Attribute.Identification]; x.Load(field).IsNull().Then(y => { y.Assign(field).NewObj(item.Attribute); if (item.HasSyncRootInterface) { y.Load(field).As(syncRoot.ToBuilderType.Import()).Call(syncRoot.SyncRoot, member.SyncRoot); } ImplementAssignMethodAttribute(builder, legalSetterInterceptors[i].AssignMethodAttributeInfos, field, y, false); }); item.Attribute.Remove(); } x.Load(propertyField).IsNull().Then(y => y.Assign(propertyField) .NewObj(propertyInterceptionInfo.Ctor, member.Property.Getter, member.Property.Setter, member.Property.Name, member.Property.ReturnType, Crumb.This, member.Property.ReturnType.IsArray || member.Property.ReturnType.Implements(typeof(IEnumerable)) ? member.Property.ReturnType.ChildType : null, propertySetter == null ? null : y.NewCode().NewObj(actionObjectCtor, propertySetter))); }) .Try(x => { if (member.Property.BackingField == null) { var oldvalue = member.Property.Getter == null ? null : x.CreateVariable(member.Property.ReturnType); if (oldvalue != null) { var getter = member.Property.Getter.Copy(); x.Call(getter.IsStatic ? null : Crumb.This, getter).StoreLocal(oldvalue); } for (int i = 0; i < legalSetterInterceptors.Length; i++) { var item = legalSetterInterceptors[i]; var field = interceptorFields[item.Attribute.Identification]; x.Load(field).As(legalSetterInterceptors[i].InterfaceSetter.ToBuilderType).Call(item.InterfaceSetter.OnSet, propertyField, oldvalue, Crumb.GetParameter(0)); x.IsFalse().Then(y => y.OriginalBodyNewMethod()); } } else { for (int i = 0; i < legalSetterInterceptors.Length; i++) { var item = legalSetterInterceptors[i]; var field = interceptorFields[item.Attribute.Identification]; x.Load(field).As(legalSetterInterceptors[i].InterfaceSetter.ToBuilderType).Call(item.InterfaceSetter.OnSet, propertyField, member.Property.BackingField, Crumb.GetParameter(0)); x.IsFalse().Then(y => y.OriginalBody()); } } }) .Catch(typeof(Exception), x => { for (int i = 0; i < legalSetterInterceptors.Length; i++) { var item = legalSetterInterceptors[i]; var field = interceptorFields[item.Attribute.Identification]; x.Load(field).As(legalSetterInterceptors[i].InterfaceSetter.ToBuilderType).Call(legalSetterInterceptors[i].InterfaceSetter.OnException, x.Exception); } x.Rethrow(); }) .Finally(x => { for (int i = 0; i < legalSetterInterceptors.Length; i++) { var item = legalSetterInterceptors[i]; var field = interceptorFields[item.Attribute.Identification]; x.Load(field).As(legalSetterInterceptors[i].InterfaceSetter.ToBuilderType).Call(legalSetterInterceptors[i].InterfaceSetter.OnExit); } }) .EndTry() .Return() .Replace(); }
public BreadCrumb() { Crumb home = new Crumb { Title = "home", Page = "/Pages/Home.aspx" }; this.Crumbs.Add(new Crumb { Title = "students", Page = "/Pages/Students.aspx", Previous = home }); this.Crumbs.Add(new Crumb { Title = "projects", Page = "/Pages/Projects.aspx", Previous = home }); Crumb login = new Crumb { Title = "login", Page = "/Pages/Login.aspx", Previous = home }; this.Crumbs.Add(login); this.Crumbs.Add(new Crumb { Title = "logout", Page = "/Pages/Logout.aspx", Previous = home }); this.Crumbs.Add(new Crumb { Title = "register", Page = "/Pages/Register.aspx", Previous = login }); Crumb settings = new Crumb { Title = "settings", Page = "/Pages/Settings.aspx", Previous = home }; this.Crumbs.Add(settings); this.Crumbs.Add(new Crumb() { Title = "publicize student", Page = "/Pages/Controls/Mentor/PublicizeStudent.aspx", Previous = settings }); Crumb viewSuggestions = (new Crumb() { Title = "view suggestions", Page = "/Pages/Controls/Mentor/ViewSuggestions.aspx", Previous = settings }); this.Crumbs.Add(viewSuggestions); this.Crumbs.Add(new Crumb() { Title = "update suggestions", Page = "/Pages/Controls/Mentor/UpdateSuggestions.aspx", Previous = viewSuggestions }); Crumb viewMessages = (new Crumb() { Title = "view messages", Page = "/Pages/Controls/Mentor/ViewMessages.aspx", Previous = settings }); this.Crumbs.Add(viewMessages); this.Crumbs.Add(new Crumb() { Title = "view message", Page = "/Pages/Controls/Mentor/ViewMessage.aspx", Previous = viewMessages }); this.Crumbs.Add(new Crumb() { Title = "search students", Page = "/Pages/Controls/Mentor/SearchStudents.aspx", Previous = settings }); this.Crumbs.Add(new Crumb() { Title = "change password", Page = "/Pages/Controls/Mentor/ChangePassword.aspx", Previous = settings }); this.Crumbs.Add(new Crumb { Title = "view skillset", Page = "/Pages/Controls/Admin/ViewSkillset.aspx", Previous = settings }); this.Crumbs.Add(new Crumb { Title = "create account", Page = "/Pages/Controls/Admin/CreateAccount.aspx", Previous = settings }); this.Crumbs.Add(new Crumb { Title = "view student", Page = "/Pages/Controls/Admin/ViewStudent.aspx", Previous = settings }); this.Crumbs.Add(new Crumb { Title = "view request", Page = "/Pages/Controls/Admin/ViewRequest.aspx", Previous = settings }); this.Crumbs.Add(new Crumb { Title = "update profile", Page = "/Pages/Controls/Student/UpdateProfile.aspx", Previous = settings }); Crumb viewSkillsets = new Crumb { Title = "view skillsets", Page = "/Pages/Controls/Admin/ViewSkillset.aspx", Previous = settings }; this.Crumbs.Add(viewSkillsets); this.Crumbs.Add(new Crumb { Title = "update skillset", Page = "/Pages/Controls/Admin/UpdateSkillset.aspx", Previous = viewSkillsets }); this.Crumbs.Add(new Crumb { Title = "create skillset", Page = "/Pages/Controls/Admin/CreateSkillset.aspx", Previous = viewSkillsets }); Crumb viewStudent = new Crumb { Title = "view students", Page = "/Pages/Controls/Admin/ViewStudent.aspx", Previous = settings }; this.Crumbs.Add(viewStudent); this.Crumbs.Add(new Crumb { Title = "update profile", Page = "/Pages/Controls/Admin/UpdateProfile.aspx", Previous = viewStudent }); Crumb updateProjects = new Crumb { Title = "update projects", Page = "/Pages/Controls/Student/UpdateProjects.aspx", Previous = settings }; this.Crumbs.Add(updateProjects); this.Crumbs.Add(new Crumb { Title = "create project", Page = "/Pages/Controls/Student/CreateProject.aspx", Previous = updateProjects }); this.Crumbs.Add(new Crumb { Title = "edit project", Page = "/Pages/Controls/Student/UpdateProject.aspx", Previous = updateProjects }); this.Crumbs.Add(new Crumb { Title = "edit reflections", Page = "/Pages/Controls/Student/UpdateProjectReflections.aspx", Previous = updateProjects }); this.Crumbs.Add(new Crumb { Title = "view suggestions", Page = "/Pages/Controls/Student/ViewSuggestions.aspx", Previous = settings }); this.Crumbs.Add(new Crumb { Title = "send request", Page = "/Pages/Controls/Parent/SendRequest.aspx", Previous = settings }); this.Crumbs.Add(new Crumb { Title = "send message", Page = "/Pages/Controls/Parent/Selection.aspx", Previous = settings }); this.Crumbs.Add(new Crumb { Title = "send message", Page = "/Pages/Controls/Parent/Messages.aspx", Previous = settings }); this.Crumbs.Add(new Crumb { Title = "reply message", Page = "/Pages/Controls/Parent/Reply.aspx", Previous = settings }); }
private static void AddValidDateFromCrumbToList(List <DateTime?> crumbsDates, Crumb crumb) { var parsedDateTime = crumb.CreatedDtm.ParseDateTimeNull(); if (parsedDateTime != null) { crumbsDates.Add(parsedDateTime); } }
void FixedUpdate() { if (active){ if (tracking){ // Track crumb Vector3 dir = crumb.pos; dir.y = transform.position.y; dir = dir-transform.position; float angle = Vector3.Angle(transform.forward,dir); // Rate is per 180 degrees transform.forward = Vector3.SmoothDamp(transform.forward,dir.normalized,ref rRate, rotRate*angle/180); if (!paused){ // Check approach distance if (pvis){ if (dir.magnitude > 1.2f){ transform.position += transform.forward*speed*Time.fixedDeltaTime; } else { // Bounce! transform.position -= transform.forward*speed*Time.fixedDeltaTime; } } else { if (dir.magnitude > 0.5f){ transform.position += transform.forward*speed*Time.fixedDeltaTime; } else { // Get next crumb if (crumbing){ crumb = PlayerCharacter.NextCrum(crumb); } else { // Get nearest player crumb float minSM = 999; foreach (Crumb c in PlayerCharacter.crumbs){ Vector3 dp = c.pos - transform.position; // Check if nearer than current float dps = dp.sqrMagnitude; if (dps < minSM){ crumb = c; minSM = dps; } } if (crumb != null){ // Check LoS // Start at index of current crumb and work backwards for (int i=PlayerCharacter.crumbs.IndexOf(crumb); i>=0; --i){ RaycastHit hit; if (Physics.Linecast(transform.position, PlayerCharacter.crumbs[i].pos, out hit)){ // Obstructed if (PlayerCharacter.CheckCollider(hit.collider)){ // By player, so set new crumb SetCrumb(); } } else { // No obstruction crumb = PlayerCharacter.crumbs[i]; break; } } crumbing = true; } } } } } } else { // Rotate towards player so AI doesn't run in wrong dir when visible float angle = Vector3.Angle(transform.forward,(PlayerCharacter.pos-transform.position)); Vector3 target = (PlayerCharacter.pos-transform.position).normalized; // Rate is per 180 degrees transform.forward = Vector3.SmoothDamp(transform.forward,target,ref rRate, rotRate*angle/180); } // Evasion if (tracking){ RaycastHit[] temp = Physics.SphereCastAll(transform.position,avoidRange,transform.forward,0,avoidLayers.value); if (temp.Length > 0){ Vector3 dir = new Vector3(); foreach (RaycastHit h in temp){ dir += (h.point - transform.position).normalized; } Debug.DrawLine(transform.position,transform.position-dir,Color.blue,Time.fixedDeltaTime); dir /= temp.Length; GetComponent<Rigidbody>().AddForce(avoidForce*dir.normalized*Time.fixedDeltaTime); } } } }
private static void CreatePropertySetterDelegate(Builder builder, PropertyBuilderInfo member, Method propertySetter) { var iList = new __IList(builder); var setterCode = propertySetter.NewCode(); if (!member.Property.BackingField.FieldType.IsGenericType) { var extensions = new __Extensions(builder); if (member.Property.BackingField.FieldType.ParameterlessContructor != null && member.Property.BackingField.FieldType.ParameterlessContructor.IsPublic) { setterCode.Load(member.Property.BackingField).IsNull().Then(y => y.Assign(member.Property.BackingField).Set(propertySetter.NewCode() .NewObj(member.Property.BackingField.FieldType.ParameterlessContructor))); } // Only this if the property implements idisposable if (member.Property.BackingField.FieldType.Implements(typeof(IDisposable))) { setterCode.Call(extensions.TryDisposeInternal, member.Property.BackingField); } setterCode.Load(Crumb.GetParameter(0)).IsNull().Then(x => { // Just clear if its clearable if (member.Property.BackingField.FieldType.Implements(iList.Type.Fullname)) { x.Load(member.Property.BackingField).Callvirt(iList.Clear).Return(); } // Otherwise if the property is not a value type and nullable else if (!member.Property.BackingField.FieldType.IsValueType || member.Property.BackingField.FieldType.IsNullable || member.Property.BackingField.FieldType.IsArray) { x.Assign(member.Property.BackingField).Set(null).Return(); } else // otherwise... throw an exception { x.ThrowNew(typeof(NotSupportedException), "Value types does not accept null values."); } }); if (member.Property.BackingField.FieldType.IsArray) { setterCode.Load(Crumb.GetParameter(0)).Is(typeof(IEnumerable)) .Then(x => x.Assign(member.Property.BackingField).Set(Crumb.GetParameter(0)).Return()) .ThrowNew(typeof(NotSupportedException), "Value does not inherits from IEnumerable"); } else if (member.Property.BackingField.FieldType.Implements(iList.Type.Fullname) && member.Property.BackingField.FieldType.ParameterlessContructor != null) { var addRange = member.Property.BackingField.FieldType.GetMethod("AddRange", 1, false); if (addRange == null) { var add = member.Property.BackingField.FieldType.GetMethod("Add", 1); var array = setterCode.CreateVariable(member.Property.BackingField.FieldType.ChildType.MakeArray()); setterCode.Assign(array).Set(Crumb.GetParameter(0)); setterCode.For(array, (x, item) => x.Load(member.Property.BackingField).Callvirt(add, item)); if (!add.ReturnType.IsVoid) { setterCode.Pop(); } } else { setterCode.Load(member.Property.BackingField).Callvirt(addRange, Crumb.GetParameter(0)); } } else if (member.Property.BackingField.FieldType.IsEnum) { // Enums requires special threatment setterCode.Load(Crumb.GetParameter(0)).Is(typeof(string)).Then(x => { var stringVariable = setterCode.CreateVariable(typeof(string)); setterCode.Assign(stringVariable).Set(Crumb.GetParameter(0)); setterCode.Assign(member.Property.BackingField).Set(stringVariable).Return(); }); setterCode.Assign(member.Property.BackingField).Set(Crumb.GetParameter(0)); } else { setterCode.Assign(member.Property.BackingField).Set(Crumb.GetParameter(0)); } } else { setterCode.Assign(member.Property.BackingField).Set(Crumb.GetParameter(0)); } setterCode.Return().Replace(); }
private void CreateComponentCache(Builder builder, BuilderType cauldron) { var componentAttribute = __ComponentAttribute.Instance; var componentConstructorAttribute = __ComponentConstructorAttribute.Type; var factory = __Factory.Instance; // Before we start let us find all factoryextensions and add a component attribute to them var factoryResolverInterface = __IFactoryResolver.Type; this.AddComponentAttribute(builder, builder.FindTypesByInterface(factoryResolverInterface), x => factoryResolverInterface.Fullname); // Also the same to all types that inherits from Factory<> var factoryGeneric = __Factory_1.Type; this.AddComponentAttribute(builder, builder.FindTypesByBaseClass(factoryGeneric), type => { var factoryBase = type.BaseClasses.FirstOrDefault(x => x.Fullname.StartsWith("Cauldron.Activator.Factory")); if (factoryBase == null) { return(type.Fullname); } return(factoryBase.GetGenericArgument(0).Fullname); }); int counter = 0; var arrayAvatar = builder.GetType("System.Array").New(x => new { Length = x.GetMethod("get_Length") }); var extensionAvatar = builder.GetType("Cauldron.ExtensionsReflection").New(x => new { CreateInstance = x.GetMethod("CreateInstance", 2) }); var factoryCacheInterface = builder.GetType("Cauldron.Activator.IFactoryCache"); var factoryTypeInfoInterface = builder.GetType("Cauldron.Activator.IFactoryTypeInfo"); var createInstanceInterfaceMethod = factoryTypeInfoInterface.GetMethod("CreateInstance", 1); // Get all Components var components = builder.FindTypesByAttribute(componentAttribute.ToBuilderType); var componentTypes = new List <BuilderType>(); // Create types with the components properties foreach (var component in components) { this.Log("Hardcoding component factory .ctor: " + component.Type.Fullname); var componentType = builder.CreateType("", TypeAttributes.Public | TypeAttributes.Sealed | TypeAttributes.BeforeFieldInit, $"<>f__IFactoryTypeInfo_{component.Type.Name}_{counter++}"); var componentAttributeField = componentType.CreateField(Modifiers.Private, componentAttribute.ToBuilderType, "componentAttribute"); componentType.AddInterface(factoryTypeInfoInterface); componentTypes.Add(componentType); // Create ctor componentType .CreateConstructor() .NewCode() .Context(x => { x.Load(Crumb.This).Call(builder.GetType(typeof(object)).Import().ParameterlessContructor.Import()); x.Assign(componentAttributeField).NewObj(component); }) .Return() .Replace(); // Implement the methods componentType.CreateMethod(Modifiers.Public | Modifiers.Overrrides, createInstanceInterfaceMethod.ReturnType, createInstanceInterfaceMethod.Name, createInstanceInterfaceMethod.Parameters) .NewCode() .Context(x => { var localVariable = x.GetReturnVariable(); // Find any method with a componentcontructor attribute var ctors = component.Type.GetMethods(y => { if (y.Name == ".cctor") { return(true); } if (!y.Resolve().IsPublic || !y.Resolve().IsAssembly) { return(false); } if (y.Name == ".ctor" && y.DeclaringType.FullName.GetHashCode() != component.Type.Fullname.GetHashCode() && y.DeclaringType.FullName != component.Type.Fullname) { return(false); } if (y.Name.StartsWith("set_")) { return(false); } return(true); }) .Where(y => y.CustomAttributes.HasAttribute(componentConstructorAttribute)) .Concat( component.Type.GetAllProperties().Where(y => y.CustomAttributes.HasAttribute(componentConstructorAttribute)) .Select(y => { y.CustomAttributes.Remove(componentConstructorAttribute); y.CustomAttributes.AddEditorBrowsableAttribute(EditorBrowsableState.Never); return(y.Getter); }) ) .OrderBy(y => y.Parameters.Length) .ToArray(); if (ctors.Length > 0) { bool parameterlessCtorAlreadyHandled = false; for (int index = 0; index < ctors.Length; index++) { this.Log("- " + ctors[index].Fullname); var ctor = ctors[index]; // add a EditorBrowsable attribute ctor.CustomAttributes.AddEditorBrowsableAttribute(EditorBrowsableState.Never); var ctorParameters = ctor.Parameters; if (ctorParameters.Length > 0) { // In this case we have to find a parameterless constructor first if (component.Type.ParameterlessContructor != null && !parameterlessCtorAlreadyHandled && component.Type.ParameterlessContructor.IsPublicOrInternal) { x.Load(Crumb.GetParameter(0)).IsNull().Then(y => y.NewObj(component.Type.ParameterlessContructor).Dup().Call(factory.OnObjectCreation, Crumb.This).Return()); x.Load(Crumb.GetParameter(0)).Call(arrayAvatar.Length).EqualTo(0).Then(y => y.NewObj(component.Type.ParameterlessContructor).Dup().Call(factory.OnObjectCreation, Crumb.This).Return()); parameterlessCtorAlreadyHandled = true; } var code = x.Load(Crumb.GetParameter(0)).Call(arrayAvatar.Length).EqualTo(ctorParameters.Length); for (int i = 0; i < ctorParameters.Length; i++) { code.And.Load(Crumb.GetParameter(0).UnPacked(i)).Is(ctorParameters[i]); } if (ctor.Name == ".ctor") { code.Then(y => y.NewObj(ctor, Crumb.GetParameter(0).UnPacked()).Dup().Call(factory.OnObjectCreation, Crumb.This).Return()); } else { code.Then(y => y.Call(ctor, Crumb.GetParameter(0).UnPacked()).Dup().Call(factory.OnObjectCreation, Crumb.This).Return()); } } else { if (ctor.Name == ".ctor") { x.Load(Crumb.GetParameter(0)).IsNull().Then(y => y.NewObj(ctor).Dup().Call(factory.OnObjectCreation, Crumb.This).Return()); x.Load(Crumb.GetParameter(0)).Call(arrayAvatar.Length).EqualTo(0).Then(y => y.NewObj(ctor).Dup().Call(factory.OnObjectCreation, Crumb.This).Return()); } else { x.Load(Crumb.GetParameter(0)).IsNull().Then(y => y.Call(ctor).Dup().Call(factory.OnObjectCreation, Crumb.This).Return()); x.Load(Crumb.GetParameter(0)).Call(arrayAvatar.Length).EqualTo(0).Then(y => y.Call(ctor).Dup().Call(factory.OnObjectCreation, Crumb.This).Return()); } parameterlessCtorAlreadyHandled = true; } } } else { // In case we don't have constructor with ComponentConstructor Attribute, // then we should look for a parameterless Ctor if (component.Type.ParameterlessContructor == null) { this.Log(LogTypes.Error, component.Type, $"The component '{component.Type.Fullname}' has no ComponentConstructor attribute or the constructor is not public"); } else if (component.Type.ParameterlessContructor.IsPublicOrInternal) { x.Load(Crumb.GetParameter(0)).IsNull().Then(y => y.NewObj(component.Type.ParameterlessContructor).Dup().Call(factory.OnObjectCreation, Crumb.This).Return()); x.Load(Crumb.GetParameter(0)).Call(arrayAvatar.Length).EqualTo(0).Then(y => y.NewObj(component.Type.ParameterlessContructor).Dup().Call(factory.OnObjectCreation, Crumb.This).Return()); this.Log($"The component '{component.Type.Fullname}' has no ComponentConstructor attribute. A parameterless ctor was found and will be used."); } } }) .Context(x => x.Call(extensionAvatar.CreateInstance, component.Type, Crumb.GetParameter(0)).Dup().Call(factory.OnObjectCreation, Crumb.This).Return()) .Return() .Replace(); // Implement the properties foreach (var property in factoryTypeInfoInterface.Properties) { var propertyResult = componentType.CreateProperty(Modifiers.Public | Modifiers.Overrrides, property.ReturnType, property.Name, true); propertyResult.BackingField.Remove(); switch (property.Name) { case "ContractName": propertyResult.Getter.NewCode().Call(componentAttributeField, componentAttribute.ContractName).Return().Replace(); break; case "CreationPolicy": propertyResult.Getter.NewCode().Call(componentAttributeField, componentAttribute.Policy).Return().Replace(); break; case "Priority": propertyResult.Getter.NewCode().Call(componentAttributeField, componentAttribute.Priority).Return().Replace(); break; case "Type": propertyResult.Getter.NewCode().Load(component.Type).Return().Replace(); break; } } componentType.CustomAttributes.AddEditorBrowsableAttribute(EditorBrowsableState.Never); // Also remove the component attribute component.Attribute.Remove(); } this.Log("Adding component IFactoryCache Interface"); cauldron.AddInterface(factoryCacheInterface); var factoryCacheInterfaceAvatar = factoryCacheInterface.New(x => new { Components = x.GetMethod("GetComponents") }); var ctorCoder = cauldron.ParameterlessContructor.NewCode(); cauldron.CreateMethod(Modifiers.Public | Modifiers.Overrrides, factoryCacheInterfaceAvatar.Components.ReturnType, factoryCacheInterfaceAvatar.Components.Name) .NewCode() .Context(x => { var resultValue = x.GetReturnVariable(); x.Newarr(factoryTypeInfoInterface, componentTypes.Count).StoreLocal(resultValue); for (int i = 0; i < componentTypes.Count; i++) { var field = cauldron.CreateField(Modifiers.Private, factoryTypeInfoInterface, "<FactoryType>f__" + i); x.Load(resultValue); x.StoreElement(factoryTypeInfoInterface, field, i); // x.StoreElement(factoryTypeInfoInterface, // x.NewCode().NewObj(componentTypes[i].ParameterlessContructor), i); ctorCoder.Assign(field).NewObj(componentTypes[i].ParameterlessContructor); } }) .Return() .Replace(); ctorCoder.Insert(InsertionPosition.End); }
private Method CreateAssigningMethod(BuilderType anonSource, BuilderType anonTarget, BuilderType anonTargetInterface, Method method) { var name = $"<{counter++}>f__Anon_Assign"; var assignMethod = method.OriginType.CreateMethod(Modifiers.PrivateStatic, anonTarget, name, anonSource); assignMethod.NewCode() .Context(x => { var resultVar = x.GetReturnVariable(); x.Assign(resultVar).Set(x.NewCode().NewObj(anonTarget.ParameterlessContructor)); foreach (var property in anonSource.Properties) { try { var targetProperty = anonTarget.GetProperty(property.Name); if (property.ReturnType.Fullname != targetProperty.ReturnType.Fullname) { this.Log(LogTypes.Error, property, $"The property '{property.Name}' does not have the expected return type. Is: {property.ReturnType.Fullname} Expected: {targetProperty.ReturnType.Fullname}"); continue; } x.Load(resultVar).Callvirt(targetProperty.Setter, x.NewCode().Load(Crumb.GetParameter(0)).Callvirt(property.Getter)); } catch (MethodNotFoundException) { this.Log(LogTypes.Warning, anonTarget, $"The property '{property.Name}' does not exist in '{anonTarget.Name}'"); } } x.Load(resultVar).Return(); }) .Replace(); assignMethod.CustomAttributes.AddEditorBrowsableAttribute(EditorBrowsableState.Never); return(assignMethod); }
public static Crumb <THelper> SetActive <THelper>(this Crumb <THelper> crumb, bool active = true) where THelper : BootstrapHelper <THelper> { crumb.Active = active; return(crumb); }