IMarkupExtension 内の指定されたパラメーターが期待する型と互換性がない場合、コンパイル時に例外をスローしたいと考えています。この効果を達成できますか?
以下に実験を載せますが、「TODO」に書いた内容をどこでどのように確認すればよいのかわかりません
コード (私は todo をマークしました)
using System;
using Xamarin.Forms.Xaml;
namespace MySample
{
public class SampleClass : IMarkupExtension
{
public IParameter Parameter { get; set; }
public object ProvideValue(IServiceProvider serviceProvider)
{
return Parameter.GetData();//TODO: throw Exception("Parameter must be of type SampleData1")
}
}
public interface IParameter
{
string GetData();
}
public class SampleData1 : IParameter
{
public string GetData()
{
return "Data1";
}
}
public class SampleData2 : IParameter
{
public string GetData()
{
return "Data2";
}
}
}
XAML
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:mysample="clr-namespace:MySample"
x:Class="MySample.SamplePage">
<ContentPage.Resources>
<mysample:SampleData2 x:Key="SampleData2" />
</ContentPage.Resources>
<ContentPage.Content>
<StackLayout>
<Label>
<Label.Text>
<mysample:SampleClass Parameter="{StaticResource SampleData2}" />
</Label.Text>
</Label>
</StackLayout>
</ContentPage.Content>
</ContentPage>
パラメータはSampleData2型ですが、SampleData1型でない場合は例外をスローしたいことに注意してください。
リソース
<mysample:SampleData2 x:Key="SampleData2" />
リソース使用量
Parameter="{StaticResource SampleData2}"
チェック(必ずしもこの場所ではありませんが、コンパイル中に確実に)
public object ProvideValue(IServiceProvider serviceProvider)
{
return Parameter.GetData();//TODO: throw Exception("Parameter must be of type SampleData1")
}