New XAG Feature - Better Generics
In the original release of XAG, properties could be generic only by using aliases. That is, if you wanted to have a property with a type of "Collection<Item>" you would have to create an alias like this:
using LineItemsCollection = System.Collections.ObjectModel.Collection<XagNewGenericsExample.Item>; ... private LineItemsCollection lineitems; public LineItemsCollection LineItems { get { return lineitems; } set { lineitems = value; } }
which in XAG's markup looked like this:
<Aliases> <Alias x:Key="LineItemsCollection" Name="Whatever" Type="System.Collections.ObjectModel.Collection[{Type Item}]" /> </Aliases> <Properties> <LineItems Type="{Type LineItemsCollection}" /> </Properties>
That's not really a bad deal as it really helps to enforce proper type design. For example, many times I will see people doing this:
public class MyAlias : Collection<Item> {}
MyAlias is NOT an alias for Collection<Item>. Try to compare them in code, they won't match up. However, in the first example "LineItemsCollection" and "Collection<Item>" are the same.
That said, I wanted to add something a bit more flexible. So I wrote an extension markup subsystem for XAG that allows for more complex generics. Here's an example of a property using the new generics system (assuming you have the System.Collections.ObjectModel namespace in):
<LineItems Type="{GenericType Name=Collection, Types=({Type Item})}" />
As you can see it's completely inline. Now here's a more complex example:
<ComplexItems Type="{GenericType Name=Dictionary, Types=(Int32, {GenericType Name=Collection, Types=({Type Item})})}" />
This XAG property translates to the following C# property:
private Dictionary<Int32, Collection<Item>> complexitems; public Dictionary<Int32, Collection<Item>> ComplexItems { get { return complexitems; } set { complexitems = value; } }
Here's a complete example you can try on your own.
<Assembly xmlns:x="http://www.jampadtechnology.com/xag/2006/11/" DefaultNamespace="XagNewGenericsExample"> <Item x:Key="Item" Type="Class" AccessModifier="Public" /> <ItemSet x:Key="ItemSet" Type="Class" AccessModifier="Public"> <Imports> <Import Name="System.Collections.Generic" /> <Import Name="System.Collections.ObjectModel" /> </Imports> <Properties> <Items Type="{GenericType Name=Collection, Types=({Type Item})}" /> <ComplexItems Type="{GenericType Name=Dictionary, Types=(Int32, {GenericType Name=Collection, Types=({Type Item})})}" /> </Properties> </ItemSet> </Assembly>So now you an have more complex generic types in your XAG structure.
Links