这看起来很奇怪,但是我将一些自定义WPF用户控件转换为WPF UserControl,我必须调用一些包含所有这些控件的方法。可能吗?怎么做?
foreach (var kid in ((MainWindow)App.Current.Windows[0]).MainCanvas.Children)
{
string kidType = kid.GetType().FullName;
if (kidType.EndsWith("MyUserControl"))
{
UserControl myUserControl = (UserControl)kid;
myUserControl.Hide() // <- this method I want to call bu it is "hidden" because of teh casting which doesn't provide access to it.
注意:方法Hide()
是公开的。
SOLUTION:
大家好!
感谢您的投入!最后我得到了解决方案。
foreach (var kid in ((MainWindow)App.Current.Windows[0]).MainCanvas.Children)
{
string kidType = kid.GetType().FullName;
if (kidType.EndsWith("UControl"))
{
Type t = kid.GetType();
object obj = Activator.CreateInstance(t);
t.InvokeMember("Hide", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, new object[] { });
// And here there is a 1000% better solution of @Erno
// dynamic myUserControl = kid;
// myUserControl.Hide();
}
}
在哪里
public void Hide()
{
// do stuff
}
答案 0 :(得分:3)
让所有用户控件实现一个接口
public interface ICanHide
{
void Hide();
}
然后这样做
foreach (var kid in ((MainWindow)App.Current.Windows[0]).MainCanvas.Children)
{
var tmp = kid as ICanHide;
if (tmp != null)
{
tmp.Hide();
}
}
答案 1 :(得分:2)
dynamic
可能有助于防止编写反射代码(See this):
foreach (var kid in ((MainWindow)App.Current.Windows[0]).MainCanvas.Children) {
string kidType = kid.GetType().FullName;
if (kidType.EndsWith("MyUserControl"))
{
dynamic myUserControl = kid;
myUserControl.Hide();
}
}
请确保添加一些异常处理,以防您遇到符合名称但未实现隐藏的类型。
如果您担心这一点,您可以在所有UserControl上实现一个接口,然后尝试使用该接口。
答案 2 :(得分:0)
你必须多做一次演员:
foreach (var kid in ((MainWindow)App.Current.Windows[0]).MainCanvas.Children)
{
string kidType = kid.GetType().FullName;
if (kidType.EndsWith("MyUserControl"))
{
UserControl myUserControl = (UserControl)kid;
if (myUserControl is MyUserControlClass)
{
(myUserControl as MyUserControlClass).Hide();
}
}
}
其中MyUserControlClass是具有hide方法的类。如果您有一组具有相同Hide方法的控件,这些控件不是由具有Hide的基类派生的,您可以:
为每个控件类创建一个强制转换
创建您自己的控件,让它们从方法Hide继承。
编辑:
或反思:
typeof(ctrlobject.GetType()).GetMethod("Hide").Invoke(ctrlobject, new object[] { });
答案 3 :(得分:0)
MyUserControl muc = kid as MyUserControl;
if (muc != null)
muc.Hide();