il = dm.GetILGenerator (256);
System.Reflection.Emit.Label end = il.DefineLabel ();
System.Reflection.Emit.Label test = il.DefineLabel ();
-
//get the dataSource of the arg0
il.Emit (OpCodes.Ldarg_0);
il.Emit (OpCodes.Callvirt, CompilerServices.miGetDataSource);
}else
emitGetSubData(il, dataType);
}
- il.Emit (OpCodes.Isinst, typeof(System.Collections.ICollection));
il.Emit (OpCodes.Dup);//duplicate children for testing if it's a collection for childs counting
+ il.Emit (OpCodes.Isinst, typeof(System.Collections.ICollection));
il.Emit (OpCodes.Brtrue, test);//if true, jump to perform count
- il.Emit (OpCodes.Pop);//pop null
- il.Emit (OpCodes.Ldc_I4_0);//push false
+ il.Emit (OpCodes.Isinst, typeof(System.Collections.IEnumerable));//test if enumerable
+ System.Reflection.Emit.Label pushTrue = il.DefineLabel ();
+ il.Emit (OpCodes.Brtrue, pushTrue);
+ il.Emit (OpCodes.Ldc_I4_0);//is not an enumerable, so push false for return
+ il.Emit (OpCodes.Br, end);
+ il.MarkLabel (pushTrue);
+ il.Emit (OpCodes.Ldc_I4_1);//is an enumerable, so push true for return
il.Emit (OpCodes.Br, end);
il.MarkLabel (test);
-
+ il.Emit (OpCodes.Isinst, typeof(System.Collections.ICollection));
il.Emit (OpCodes.Callvirt, CompilerServices.miGetColCount);
il.Emit (OpCodes.Ldc_I4_0);
il.Emit (OpCodes.Cgt);
HasSubItems = (BooleanTestOnInstance)dm.CreateDelegate (typeof(BooleanTestOnInstance));
#endregion
}
+ static void emitcallvirtornot (ILGenerator il, MethodInfo mi) {
+ if (mi.IsStatic)
+ il.Emit (OpCodes.Call, mi);
+ else
+ il.Emit (OpCodes.Callvirt, mi);
+ }
//data is on the stack
void emitGetSubData(ILGenerator il, Type dataType){
if (dataType.IsValueType)
il.Emit (OpCodes.Unbox_Any, dataType);
- MethodInfo miGetDatas = dataType.GetMethod (fetchMethodName, new Type[] {});
- if (miGetDatas == null)
- miGetDatas = iface.SearchExtMethod (dataType, fetchMethodName);
-
- if (miGetDatas == null) {//in last resort, search among properties
- PropertyInfo piDatas = dataType.GetProperty (fetchMethodName);
- if (piDatas == null) {
- FieldInfo fiDatas = dataType.GetField (fetchMethodName);
- if (fiDatas == null)//and among fields
- throw new Exception ("Fetch data member not found in ItemTemplate: " + fetchMethodName);
- il.Emit (OpCodes.Ldfld, fiDatas);
- return;
- }
- miGetDatas = piDatas.GetGetMethod ();
- if (miGetDatas == null)
+ MemberInfo miGetData = dataType.GetMember (fetchMethodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
+ .FirstOrDefault(mmi => (mmi is MethodInfo mmmi && mmmi.GetParameters().Length == 0) || mmi.MemberType != MemberTypes.Method);
+
+ if (miGetData == null) {
+ MethodInfo extMethd = iface.SearchExtMethod (dataType, fetchMethodName);
+ if (extMethd == null)
+ throw new Exception ("Fetch data member not found in ItemTemplate: " + fetchMethodName);
+ emitcallvirtornot (il, extMethd);
+ return;
+ }
+ if (miGetData is MethodInfo mi) {
+ emitcallvirtornot (il, mi);
+ return;
+ }
+ if (miGetData is PropertyInfo pi) {
+ if (!pi.CanRead)
throw new Exception ("Write only property for fetching data in ItemTemplate: " + fetchMethodName);
+ emitcallvirtornot (il, pi.GetGetMethod ());
+ //il.Emit (OpCodes.Call, pi.GetGetMethod ());
+ return;
+ }
+ if (miGetData is FieldInfo fi) {
+ il.Emit (OpCodes.Ldfld, fi);
+ return;
}
- if (miGetDatas.IsStatic)
- il.Emit (OpCodes.Call, miGetDatas);
- else
- il.Emit (OpCodes.Callvirt, miGetDatas);
}
}
--- /dev/null
+<TreeView IsRoot="true" Name="lbCtxs" Data="{AllLoadContexts}" UseLoadingThread = 'false' >
+ <!--<ItemTemplate DataType="System.Reflection.Assembly">
+ <ListItem CornerRadius="2" Margin="0" Height="Fit" Width="Stretched"
+ Selected="{Background=${ControlHighlight}}"
+ Unselected="{Background=Transparent}">
+ <HorizontalStack>
+ <Label Text="{}" Width="Stretched"/>
+ </HorizontalStack>
+ </ListItem>
+ </ItemTemplate>-->
+ <ItemTemplate DataType="System.Runtime.Loader.AssemblyLoadContext" Data="Assemblies">
+ <ListItem
+ Selected="{/exp.Background=${ControlHighlight}}"
+ Unselected="{/exp.Background=Transparent}">
+ <Expandable Name="exp" Caption="{}" MouseDoubleClick="/onClickForExpand" BubbleEvents="All">
+ <Template>
+ <VerticalStack>
+ <Border CornerRadius="2" Margin="0" Height="Fit" MouseDoubleClick="./onClickForExpand"
+ Foreground="Transparent"
+ MouseEnter="{Foreground=DimGrey}"
+ MouseLeave="{Foreground=Transparent}">
+ <HorizontalStack Background="{./Background}" Spacing="1">
+ <Image Margin="1" Width="9" Height="9" Focusable="true" MouseDown="./onClickForExpand"
+ Path="{./Image}"
+ Visible="{./IsExpandable}"
+ SvgSub="{./IsExpanded}"
+ MouseEnter="{Background=LightGrey}"
+ MouseLeave="{Background=Transparent}"/>
+ <Image Margin="1" Width="16" Height="16"
+ Path="#Crow.Icons.folder.svg" SvgSub="{./IsExpanded}"/>
+ <Label Text="{}"/>
+ </HorizontalStack>
+ </Border>
+ <Container Name="Content" Visible="false"/>
+ </VerticalStack>
+ </Template>
+ <HorizontalStack Height="Fit">
+ <Widget Width="12" Height="10"/>
+ <VerticalStack Height="Fit" Name="ItemsContainer"/>
+ </HorizontalStack>
+ </Expandable>
+ </ListItem>
+ </ItemTemplate>
+ </TreeView>
\ No newline at end of file