XAMLにシリアライズするプロパティにはList<T>よりもCollection<T>を使うべき?
アプリケーションの設定をXAMLで書き出そうと、以下のようなコードを書きました。
using System.Windows.Markup;
using System.Xaml;
public class Item
{
}
[ContentProperty("Items")]
public class Settings
{
public List<Item> Items { get; set; } = new List<Item>();
}
void Main()
{
var settings = new Settings();
settings.Items.Add(new Item());
settings.Items.Add(new Item());
Console.WriteLine(XamlServices.Save(settings));
}
上のコードでは <Root>
の直下に <Item>
が並ぶことを期待していたのですが、出力してみると間に <scg:List ...>
という要素が入ってしまいます。
<Settings xmlns="clr-namespace:;assembly=query_qufjxk" xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<scg:List x:TypeArguments="Item" Capacity="4">
<Item />
<Item />
</scg:List>
</Settings>
色々試した結果、List<T>
ではなく Collection<T>
を使えば、期待通りになることがわかりました。
<Settings xmlns="clr-namespace:;assembly=query_ujgmdq">
<Item />
<Item />
</Settings>
個人的には後者の方がWPFなどで馴染みのある形なので、もしかするとXAMLでは List<T>
より Collection<T>
(あるいは別の型)を使う慣習があるのではと思った次第です。気にせず List<T>
を使えばいいのでしょうか?
独自のコレクション型を実装するのであれば List<T>
より Collection<T>
を継承するだろうとは思うのですが、今回はそこまでする予定はないので List<T>
で格納するつもりでいました。