IMarkupExtension - проверка типа свойства во время компиляции (xamarin.forms)
Я хотел бы выдать исключение во время компиляции, если данный параметр в IMarkupExtension не совместим с ожидаемым мной типом. Могу ли я достичь этого эффекта?
Ниже я ставлю свои эксперименты, но я не знаю, где и как проверить, что я написал в "ТОДО"
Код (я пометил 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")
}
1 ответ
Я думаю, что невозможно сгенерировать исключение во время компиляции. Логические ошибки не могут быть обнаружены компилятором, и, следовательно, они обнаруживаются только при выполнении программы.
Ошибка времени компиляции:
Если мы не соблюдаем правильный синтаксис и семантику любого языка программирования, компилятор выдаст ошибку времени компиляции.
Например:
1. пропущенная точка с запятой
2. писать ключевые слова в верхнем регистре
3. Переменный не защищать и т. Д.
Ошибка выполнения:
Ошибка выполнения генерируется, когда программа находится в рабочем состоянии. Их часто называют исключением.
Например:
1. Деление на ноль
2. нехватка памяти
3. нулевой указатель и т. Д.
Вы можете использовать код ниже, чтобы throw a Exception
когда эта функция сработала и Parameter
не из SampleData1
тип.
public object ProvideValue()
{
if (Parameter is SampleData1)
{
return Parameter.GetData();//TODO: throw Exception("Parameter must be of type SampleData1")
}
else if (Parameter is SampleData2)
{
throw new Exception("Parameter must be of type SampleData1");
}
return "error";
}