gpt4 book ai didi

C# 在转换后访问类成员

转载 作者:行者123 更新时间:2023-11-30 17:07:12 25 4
gpt4 key购买 nike

我一直在使用 C# 和 XAML,想知道是否有更好的方法来在转换后访问类的成员。这是我通常最终不得不做的事情的一个例子:

private void MyButton_Clicked(object sender,  RoutedEventtArgs e)
{
((PlaneProjection)((Button)sender).Projection).RotationX = 20;
}

它会在您每次单击时旋转按钮,但对于更复杂的操作,我需要越来越多的括号。我知道我可以使用 as which 使它更容易阅读,但仍然可以:

((sender as Button).Projection as PlaneProjection).RotationX = 20;

括号比我想要的还要多。

我是在做这个很长的路还是遗漏了什么?或者这就是它的方式,我将不得不处理这样的代码更难阅读的可能性?

最佳答案

(A) 严格来说,不行,没办法。在您进行强制转换 之后,您会得到一个不同类型的临时值 - 并且在强制转换之后几乎没有留下任何语法分支,无论是正常的强制转换还是 AS 运算符。您必须将它括起来并立即使用它,或者您必须将它存储在一个变量中。

(B) 松散地说,有一个方法:就是根本不做类型转换。但请注意,它将:

  • 需要较新的 .Net 平台
  • 不太安全(编译时名称检查关闭)
  • 更不安全(运行时类型检查关闭,如果找到属性名则使用它,不管变量中的确切对象类型是什么)
  • 性能稍差(简而言之,动态操作比编译操作慢)

好吧,正如我所说的动态,它使用 CLR4.0 动态表达式:

private void MyButton_Clicked(object sender,  RoutedEventtArgs e)
{
dynamic tmp = sender;
tmp.Projection.RotationX = 20;
}

但是,我真的不建议只是为了跳过一些括号而这样做。这个表达式中有零类型检查。这是 100% 鸭子打字。对于 Button,没关系,因为按钮的 API 真的不太可能改变。但对于您自己的经常会发生变异的代码,请小心 - 或包括适当的单元测试以判断属性是否存在。

关于C# 在转换后访问类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14754270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com