private void Add <TEditor, TRow>(BsEditorGroupAttribute attr, IBsEditorGroupModel model, object[] editableTabIds, string propertyName) where TEditor : IBsEditorGroupModel where TRow : BsEditorGroupItemModel, new() { var group = new BsEditorGroupBuilder <TEditor>(model, this.viewContext, editableTabIds) .Id(attr.Id); group.SetPropertyName(propertyName); var rowType = typeof(TRow); var genericArgs = rowType.BaseType.GetGenericArguments(); if (genericArgs.Count() == 1) // register renderer via reflection because we don't know the type of TForm { var method = typeof(BsEditorGroupBuilder <TEditor>).GetMethod("RegisterRenderer", BindingFlags.Default | BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.NonPublic); var generic = method.MakeGenericMethod(typeof(TRow), genericArgs[0]); // genericArgs[0] => TForm generic.Invoke(group, null); } else { group.renderer = new BsEditorGroupRenderer <TEditor, TRow>(group); } if (model != null) { var connection = model.GetTabGroupConnection(); if (connection != null) { connection.GroupId = attr.Id; this.Connections.Add(connection); } } InsertGroup <TEditor, TRow>(attr.Id, group); }
private void InsertGroup <TEditor, TRow>(object id, BsEditorGroupBuilder <TEditor> tabBuilder) where TEditor : IBsEditorGroupModel where TRow : BsEditorGroupItemModel { this.Groups.Add(id, tabBuilder); }