IMarkupExtension-在编译期间检查属性类型(xamarin.forms)

时间:2018-11-16 18:34:09

标签: xamarin.forms compilation-time

如果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 个答案:

答案 0 :(得分:1)

我认为在编译时抛出异常不可能。编译器无法检测到逻辑错误,因此仅在执行程序时才能检测到。

编译时错误:

如果我们没有遵循任何编程语言的正确语法和语义,那么编译器将抛出编译时错误。

例如:

1。缺少分号

2。以大写形式编写关键字

3。不抗辩等

运行时错误:

程序处于运行状态时,将生成运行时错误。它们通常被称为例外。

例如:

1。除以零

2。内存不足

3。取消引用空指针等

当此函数被触发并且pip install --upgrade --user matplotlib numpy pyproj pyshp OWSLib Pillow 不是throw a Exception类型时,您可以在Parameter中使用以下代码。

SampleData1