如何使用x:Object以及何时使用?

5
当使用标记扩展x:Arguments将参数传递给非默认构造函数时,根据文档的规定,我可以看到具体数据类型的使用,如x:Int32x:String,但是x:Object有什么用途呢?而且,为了使用它,应该在标签之间放置什么内容?<x:Object> ??? </x:Object> 对于整数或字符串,自然会将它们视为变量赋值,然后将变量传递给构造函数。但是在Object的情况下,这样的变量通常由另一个用户定义的类构造,那么如何指定要创建哪个类呢?
3个回答

4

x:Object

x:Object原语对应于Object。在应用程序标记中不通常使用此原语,但在某些情况下可能会有用,例如在XAML类型系统中检查可分配性。您可以将其用作参数。

请查看 Xamarin文档中的Resource Dictionaries,详细了解如何使用资源的x:Key属性。

每个资源都有一个键,该键使用x:Key属性指定,这样在ResourceDictionary中就能获得一个描述键。

您可以按以下方式使用它:

<local:MockFactory >
     <x:Arguments>
         <x:Array Type="{x:Type x:Object}">
             <x:String>Foo</x:String>
             <x:String>Bar</x:String>
         </x:Array>
     </x:Arguments>
</local:MockFactory>

您可以在这里找到一个相关的示例。


我认为你的示例展示的是x:String,而不是x:Object。我正在寻找<x:Object>...</x:Object>的用法。 - fluter

3

从技术角度来说,您可以将x:Object作为构造函数参数传递。x:Object对应于具有默认构造函数的System.Object。所以如果您有以下代码:

 public class MyClass {
     public MyClass(object arg) {

     }
 }

您可以按照以下方式构建它:
<my:MyClass>
  <x:Arguments>
    <x:Object />
  </x:Arguments>
</my:MyClass>

但这并不太有用,因为它将对应于:

new MyClass(new object());

Object没有其他构造函数 - 你不能以其他有意义的方式构造它。因此,当构造函数需要对象类型的参数时,你不想使用x:Object,而是使用实际的类型:

<my:MyClass>
  <x:Arguments>
    <x:String>string</x:String>
  </x:Arguments>
</my:MyClass>

这对应于

new MyClass("string");

2

当处理不支持的数据类型时,将其数据类型定义为x:Object的数据模板是非常好的备选数据模板。

假设您有一个屏幕,向用户显示如果导入的数据不受支持,则会看到以下结果:然后您显示x:Object的数据模板。实现这个的简单方法如下:

<ContentControl>
  <ContentControl.Content>
    <x:Object/>
  </ContentControl.Content>
</ContentControl>

为了使得可用的最具体的数据模板是x:Object,这也是所显示的内容。

Object类不包含有意义的数据,因此没有真正的理由去编写。

<x:Object></x:Object> 

因为该类型没有内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接