【问题标题】:Is it possible to declare a type alias name in XAML?是否可以在 XAML 中声明类型别名?
【发布时间】:2011-09-04 20:15:40
【问题描述】:

是否可以在 XAML 中为类型声明别名?

让我用一个例子来解释。鉴于这些类型声明...

namespace Somewhere
{
    public class Blob { … }
    public class BlobCollection : List<Blob> {}  // "type alias" in C#
}

...以下(缩写)XAML 应该是有效的:

<BlobCollection xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns="clr-namespace:Somewhere;…">
  <Blob … />
  <Blob … />
</BlobCollection>

我已经知道我可以通过继承定义类型别名之类的东西(参见上面的代码注释)。假设想在 XAML 中做同样的事情,我将如何更改 XAML 以便能够将 BlobCollection 引用为 Blobs?

<Blobs xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       xmlns="clr-namespace:Somewhere;…">
  <Blob … />
  <Blob … />
</Blobs>

【问题讨论】:

  • 将BlobCollection 别名为Blobs 听起来是个坏主意。它违反了标准命名约定。复数的 blob 对属性或字段名有意义,但对类型名没有意义。您的代码的读者必须阅读别名行才能了解发生了什么。在编程中,减少字符数以节省击键是一种虚假的经济,除非您非常小心地对可读性造成零影响。
  • @Merlyn:我知道这一点。让我们简要考虑一个 SQL 数据库,其中有一个包含 Blob 记录的表:即使您设置了将表映射到 C# BlobCollection 的 ORM,您也可能会将该表称为 Blobs。那么为什么不应该对 X(A)ML 做同样的事情呢? -- .NET 的标准命名准则不一定适用于所有地方。
  • 感谢您对我的假设提出的挑战。我还没有看到任何关于 XAML 中的命名约定的文章专门解决了这种情况。然而,XAML 仍然是 .Net 代码——它只是一个用 XML 语言指定的对象树/初始化块。 Blobs 是在您的数据层中有意义的抽象。我不会将该命名一直传播到 UI 层,原因与我们在使用 ORM 时会更改命名相同。
  • @Merlyn,我同意在任何地方使用相同的名称对于同时使用 X(A)ML 端 和 C# 端的人会有所帮助。但是,想象一下 (a) 在 C#/代码端有一个完全自动化的框架,而 XAML 作者只会直接使用顶级 C# 对象;或 (b) XAML 由某人编写,并由其他人在代码中使用。在这两种情况下,为每一方提供合适的词汇表实际上是有益的,在有意义的地方可能有所不同。 (顺便说一句,我感谢您的意见。)
  • 做出深思熟虑的决定是这里最重要的部分。让自己受教条约束不是。我很高兴您的意见得到了考虑,如果它帮助您形成更具体的意见:)

标签: c# xaml alias type-alias


【解决方案1】:

我不确定你是否可以直接在 XAML 中进行别名,但在 XAML 中使用别名是最简单的方法,只需在代码中对集合进行子类化(或者,如果不会产生负面影响,重命名集合类本身)影响您的其余代码):

public class Blobs : BlobCollection {}

似乎没有必要这样做,但这是我现在能想到的。

【讨论】:

  • 我担心这是唯一的解决方案;但我希望有人知道实现相同目标的仅限 XAML 的方法。我已经更新了我的问题。
  • +1; @stakx:如果这是您将附加到生成或现有代码的东西(OP 上的 cmets 似乎表明了这一点),那么您仍然可以选择创建另一个只定义别名的程序集,然后导入它。如果这只是绕过泛型支持,那么it seems like such support might already exist in more recent XAML standards?。如果您不能使用更新的 XAML 标准,还有 other questions on work-arounds for generic support
  • @Merlyn:感谢关于 XAML 2009 中泛型支持的提示。更新了我的问题以反映它不仅仅是泛型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 2019-12-06
  • 1970-01-01
相关资源
最近更新 更多