得到,可以使用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);
}
虽然TextBox
和RichTextBox
似乎具有相同的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 = "";
}
RichTextBox
和TextBox
都是从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
类用于非常特定的目的,不建议这样做。