C# Xamarin自定义标记扩展无法使用类型属性

C# Xamarin自定义标记扩展无法使用类型属性,c#,xaml,xamarin,xamarin.forms,C#,Xaml,Xamarin,Xamarin.forms,我正在尝试使用Type作为属性在Xamarin表单中创建自定义MarkupExtension。不幸的是,我无法传递类型的属性,在我的情况下,该属性总是null。下面是我的MarkupExtension的一个最小示例,将类型的全名返回为字符串: [ContentProperty(nameof(TheType))] public class TypeMarkupExtension : IMarkupExtension { public Type TheType { get; set; }

我正在尝试使用
Type
作为属性在Xamarin表单中创建自定义MarkupExtension。不幸的是,我无法传递
类型的属性
,在我的情况下,该属性总是
null
。下面是我的MarkupExtension的一个最小示例,将类型的全名返回为字符串:

[ContentProperty(nameof(TheType))]
public class TypeMarkupExtension : IMarkupExtension
{
    public Type TheType { get; set; }

    public object ProvideValue(IServiceProvider serviceProvider)
    {

        return TheType?.FullName ?? "Failure";
    }
}
但是无论我尝试过什么,使用MarkupExtension都是不可能的,因为
类型总是
null
,我的返回值是
“Failure”
。以下是我尝试使用扩展的方式,如:

<Label Text="{local:TypeMarkup x:Int16}"/>
<Label Text="{local:TypeMarkup {x:Type x:Int16}}"/>

如果我使用一个简单的
字符串
作为属性类型,那么代码可以完美运行。对我来说,将
类型
作为属性传递似乎是不可能的。这是正确的还是我的代码有问题?

选项1:指定属性名称 您需要在这里使用嵌套标记扩展(您已经这样做了);但您还需要指定属性的名称。否则,我的测试显示,它将被视为字符串值并分配给默认内容属性-因此,类型不匹配

因此,按照以下方式显式指定属性名称应该可以解决此问题:

<Label Text="{local:TypeMarkup TheType={x:Type x:Int16}}" ../>

完美的答案,这正好解决了我的问题,非常感谢。第二个解决方案的一个小补充:使用已经存在的实现,如
TypeExtension te=newtypeextension(){TypeName=TheType}
并使用
Te.ProvideValue(ServiceProvider)获取类型是一个非常聪明的解决方案。
[ContentProperty(nameof(TheType))]
public class TypeMarkupExtension : IMarkupExtension
{
    public string TheType { get; set; }

    public object ProvideValue(IServiceProvider serviceProvider)
    {
        if (string.IsNullOrEmpty(TheType))
            throw new InvalidOperationException("TheType isn't set.");
        
        if (serviceProvider == null)
            throw new ArgumentNullException(nameof(serviceProvider));

        var typeResolver = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;
        if (typeResolver == null)
            throw new ArgumentException("No IXamlTypeResolver in IServiceProvider");

        var resolvedType = typeResolver.Resolve(TheType, serviceProvider);
        return resolvedType?.FullName ?? "Failure";
    }
}