在 C# 中使用长 属性 语法的别名

Aliasing in C# for use with long property syntax

在 WPF 中更新文本框的文本 属性 时,我必须执行以下操作,一段时间后会变得很烦人:

window.TokenInfoText.Text += "some text";

如果我执行以下操作:

string textref = window.TokenInfoText.Text;
textref += "some text";

它会编译但不会在运行时更新 TextBox 的文本字段。

有没有一种方法可以为长语法(即 window.TokenInfoText.Text)设置“别名”,从而不必输入那么多内容?

PS:我了解 MVVM;我在这里追求的是一种更简单的方法,专门用于减少打字。类似于用于名称空间别名的“using”语句,但用于常规 variables/properties.

您可以定义将获取和设置文本字段的属性。这将使您为每个字段定义一个 属性,但会使代码更清晰。

另一种方法是将所有业务逻辑和关联的属性移动到一个单独的 class 中,与表单完全分离。然后,您可以使用数据绑定将每个字段与每个 属性 绑定。随着 属性 值的更改,它会反映在 UI.

在字段数据绑定属性中,您可以指定空值显示的内容、如何格式化数字等。

让您的代码更易于维护并允许在 Web 或移动应用程序中重复使用相同的 class 是值得的。

字符串是不可变类型,当您看似要修改一个字符串时,实际发生的是您将对一个字符串的引用替换为对另一个字符串的引用。

当你这样做时:

string textref = window.TokenInfoText.Text;

您将获得对 Text 属性 返回的字符串的引用副本。当您稍后对字符串执行 += 时,您会用另一个引用覆盖局部变量 textref 中的引用,但 Text 属性 不受影响。

但是,如果前面的属性getterTokenInfoText总是returns相同的引用,那么它将如果你不那么深入一层就可以工作,即:

var tiText = window.TokenInfoText;
tiText.Text += "some text";

无论如何,你可以出去到class级别写一个属性(也是Tarik的回答推荐的),这样就可以了:

private string Textref
{
  get => window.TokenInfoText.Text;
  set => window.TokenInfoText.Text = value;
}

然后在你的方法中你可以做 Textref += "some text";.

通常,当您访问局部变量或字段中的 属性 时,您会及时获得该值的孤立快照 - 就像看着墙上的时钟,并写下把时间记在一张纸上。如果您从副本(纸张)读取,它不会神奇地从源(时钟)更新 - 如果您更改副本的值,它不会更新源。

所以:这就是它不起作用的原因。

属性中的一个概念,它允许您想要什么:by-ref return 属性。它们具有非常小众的实用性,并且只出现了一段时间。它们还改变了 属性 的形状,因此它不能与不以这种方式暴露自身的属性一起使用。但是:它 可以做到的(在一般意义上,不是这种特定情况):

ref string foo = ref {blah some expression}.Whatever;
//
Console.WriteLine(foo); // writes the current value *from the source*
foo = "ABC"; // updates the original source

但是:这需要一个非常具体的 API,意思是:属性 必须声明为 ref stringref readonly string。这是非常非常罕见的,尤其是因为这意味着包含对象不再具有验证值或执行任何逻辑的能力——因为调用者将直接访问原始数据。