IMarkupExtension - проверка типа свойства во время компиляции (xamarin.forms) - PullRequest
0 голосов
/ 16 ноября 2018

Я хотел бы выдать исключение во время компиляции , если данный параметр в 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")
}

1 Ответ

0 голосов
/ 19 ноября 2018

Я думаю, невозможно выдать исключение во время компиляции. Логические ошибки не могут быть обнаружены компилятором, и, следовательно, они обнаруживаются только при выполнении программы.

Ошибка времени компиляции:

Если мы не соблюдаем правильный синтаксис и семантику любого языка программирования, то компилятор выдаст ошибку времени компиляции.

Например:

1. Точка с запятой

2. ввод ключевых слов в верхнем регистре

3.Допустимо не защищать и т. Д.

Ошибка выполнения:

Ошибка выполнения во время выполнения программы. Их часто называют исключением.

Например:

1.Division by zero

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";
        }
...