得到,可以使用object . gettype()设置实际对象类型

本文关键字:设置 对象 类型 可以使 object gettype 得到 | 更新日期: 2023-09-27 18:04:03

我试图使一个函数返回实际的控制。我知道当你知道对象的类型时,你可以这样做:

public static Control GetCtl(this object obj)
{
    //(obj as obj.GetType()) ?
    return (TextBox)obj;
}

但是如果我需要从其他(未知)对象类型,例如TextBox或RichTextBox得到一个呢?然后在:

上使用它
private void TextBox1_Click(object sender, EventArgs e)
{
    sender.GetCtl().Select(0, 0);
}

虽然TextBoxRichTextBox似乎具有相同的Select方法,但当我尝试上述GetCtl()函数时,它总是抛出错误。我该怎么做呢?

编辑:因为你不能在所有本地过程/方法(即_Click(), _MouseMove())中访问sender的"完整"控制属性,我想做一个可以返回实际控制的函数,不知道如何更好地解释这一点,但这里是我如何使用它:

Private void SomeControl_KeyDown(object sender, KeyEventArgs e){
    sender.getCtl().   //<-- so I can access anything here
    (sender as Button).Text = "sometext"  // <-- so I won't have to do this
    //I wish the following would work. But you get the idea
    (sender.GetType())sender.Text = "";
    //or...
    (sender as sender.GetType()).Text = "";
}

得到,可以使用object . gettype()设置实际对象类型

RichTextBoxTextBox都是从TextBoxBase派生的。

要告诉编译器你想把一个对象当作一个特定的类型,可以执行强制类型转换操作。在这种情况下,您需要将sender转换为TextBoxBase,然后您可以访问Select()方法:

private void TextBox1_Click(object sender, EventArgs e)
{
    var textbox = sender as TextBoxBase;
    if (textbox != null)
        textbox.Select(0, 0);
}

使用as关键字将sender对象强制转换为TextBoxBase。请注意,您不能简单地将任何内容强制转换为其他内容。被强制转换的对象实际上必须是要强制转换到的类型的实例。如果sender不是TextBoxBase的派生实例,则强制转换操作将返回null。

一般来说,winforms事件处理程序应该只在非常受控和已知的情况下引发-您应该非常确信该事件是由派生自TextBoxBase的控件引发的。把它和别的东西分开是没有多大意义的。

如果你真的想要一个方法将sender转换为TextBoxBase,你可以这样写:

private TextBoxBase ToTextBoxBase(object sender)
{
    var textbox = sender as TextBoxBase;
    if (textbox == null)
        throw new Exception("The given object is not derived from TextBoxBase");
    return textbox;
}

你可以这样使用:

ToTextBoxBase(sender).Select(0, 0);

如果发送者不是TextBoxBase,这个调用将抛出"给定的对象不是从TextBoxBase派生的"异常。

需要理解的重要一点是,您正在使用强类型语言。如果你试图调用一个不包含该方法的类型的对象的方法,程序甚至不会编译(除非类型是dynamic,但这是另一个讨论)。

可以创建一个方法,您可以使用以下语法调用:

sender.ToTextBoxBase()

这被称为扩展方法。但是,您将扩展System.Object类用于非常特定的目的,不建议这样做。