tmytのらくがき

個人の日記レベルです

TypeConverterのないUWP界に突如現れた彗星のようだ

UWP界にはTypeConverterがありません。どういうことかというと、WPFXamlの引数みたいなのいい感じに型に変換してくれる便利クラスTypeConverterが存在しないんです。

んでもって、仕方なくこんなのを作っていたのですが。

private static object ConvertType(string from, string type)
{
    try
    {
        // Get Internal method
        var typeName = typeof(EventTriggerBehavior).AssemblyQualifiedName
            .Replace(".EventTriggerBehavior,", ".TypeConverterHelper,");
        var typeConverterHelperType = Type.GetType(typeName);
        var typeConverterHelperConvert = typeConverterHelperType
            .GetRuntimeMethod("Convert", new[] { typeof(string), typeof(string) });
        return typeConverterHelperConvert.Invoke(null, new object[] { from, type });
    }
    catch
    {
        return null;
    }
}

Behavior SDKの中のプライベート関数をリフレクションでぶったたいてみるとなんか文字列をいい感じの型に変換してくれちゃったりする。 で、UWPが静的バインディングをサポートした関係で似たような動作をする関数がこそっと増えてたみたい。それがXamlBindingHelper.ConvertValue。

使い方はとってもシンプル

// Uriとか
Debug.WriteLine(Windows.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(Uri), "http://www.gogle.com/"));
// doubleとか
Debug.WriteLine(Windows.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(double), "10.5"));
// Visibility.Collapsedとか
Debug.WriteLine(Windows.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(Visibility), "Collapsed"));
// ImageSourceまで
Debug.WriteLine(Windows.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(ImageSource), "http://www.google.com/"));

変換できちゃうわけです。文字列から。いつどこで使うか?といわれるとあんまりないかもしれないですけど、Xamlで条件分岐するようなライブラリ使うときには便利ですよ、それはとても。