TypeConverterのないUWP界の彗星のようだ。と勝手によんでるXamlBindingHelper.ConvertValue ちゃん、圧倒的に速いでしょそりゃ。とか言ってたけど計測していなかったので計測してみました。
private static Func<string, string, object> typeConverthelperConvertFunc; private static object ConvertType(string from, Type type) { return typeConverthelperConvertFunc(from, type.FullName); } public MainPage() { this.InitializeComponent(); // Get Internal method string typeName = typeof(EventTriggerBehavior).AssemblyQualifiedName .Replace(".EventTriggerBehavior,", ".TypeConverterHelper,"); Type typeConverterHelperType = Type.GetType(typeName); MethodInfo typeConverterHelperConvert = typeConverterHelperType .GetRuntimeMethod("Convert", new[] { typeof(string), typeof(string) }); // Lambdaにするよ var p1 = Expression.Parameter(typeof(string), "from"); var p2 = Expression.Parameter(typeof(string), "type"); var m = Expression.Call(null, typeConverterHelperConvert, p1, p2); typeConverthelperConvertFunc = Expression.Lambda<Func<string, string, object>>(m, p1, p2).Compile(); } private void MainPage_OnLoaded(object sender, RoutedEventArgs ev) { Thickness x; var sw = new Stopwatch(); sw.Start(); for (var i = 0; i < 100000; ++i) { x = (Thickness)Windows.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(Thickness), "1,2"); } c1.Text = (sw.ElapsedMilliseconds / 100000.0).ToString(); c3.Text = x.ToString(); sw.Restart(); for (var i = 0; i < 100000; ++i) { x = (Thickness)ConvertType("1,2", typeof(Thickness)); } c2.Text = (sw.ElapsedMilliseconds / 100000.0).ToString(); c4.Text = x.ToString(); }
適当に代入したりしてますがあんまり気にしないで。結果ですが、こんな感じ。
上から、XamlBindingHelper.ConvertValue、BehaviorSDKのメソッド。一応リフレクションのところは式木でラムダにしてみたりしてみたものの一桁速度が違いますね。
結論
やっぱりXamlBindingHelper.ConvertValueはすごいや!!