3

我一直在使用 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;

这仍然比我想要的更多的括号。

我是在做这件事还是错过了什么?或者这就是它的方式,我将不得不处理这样的代码更难阅读的可能性?

4

4 回答 4

1
var button = sender as Button;

if (button == null)
    return;

var projection = button.Projection as PlaneProjection;

if (projection == null)
    return;

projection.RotationX = 20;

是一种更安全的方法,因为您要确保您的演员表不会抛出 NullReferenceException。

但是,我必须提到,我宁愿创建一个 ViewModel 来保存按钮可以绑定到的Double X {get;set;}和 a ,而不是在后面的代码中操作 UI 元素。Command

于 2013-02-07T15:08:38.190 回答
1

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

(B) 松散地说,有一种方法:根本不做演员表。但请注意,它将:

  • 需要更新的 .Net 平台
  • 不太安全(编译时名称检查关闭)
  • 更不安全(运行时类型检查已关闭,如果找到属性名称,则使用它,无论您在变量中具有什么确切的对象类型)
  • 性能稍差(简单地说,动态操作比编译操作慢)

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

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

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

于 2013-02-07T15:15:24.717 回答
0

如果您不喜欢括号,则可以创建变量。

var button = (Button)sender; // or 'sender as Button'
var planeProjection = (PlaneProjection)button.Projection; // or 'button.Projection as PlaneProjection'
于 2013-02-07T15:07:56.407 回答
0

我看不出有任何方法可以得到括号和演员表。

你不能把它分开吗

var planeProjection = (PlaneProjection)((Button)sender).Projection;

进而

planeProjection.RotationX = 20;
planeProjection.RotationY = 20;
planeProjection.RotationZ = 20;
于 2013-02-07T15:22:45.160 回答