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";
        }
Другие вопросы по тегам