我遇到了一个我根本无法解决的问题,我已经研究了几个小时但没有结果。请帮忙!
我正在尝试做什么:
我有一个用户控件,在我的表单上列出一个类,如果有人在列表中选择了不同的项目,我希望它在主窗体上进行更改。
所以我创建了一个活动:
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listBox1.SelectedIndex != -1)
{
Object item = this.List.GetType().GetProperty("Item").GetValue(this.List, new Object[] { listBox1.SelectedIndex });
Control a = this.TopLevelControl;
Object temp = a.GetType().GetProperty("currentExpression").GetValue( a, null );
a.GetType().GetProperty("currentExpression").SetValue(temp, item, null);
}
}
在此代码中,'a'包含主窗体。 (此事件在用户控件中运行)所以我拥有我需要的一切。
List对象是表达式列表。并且Main表单上的currentExpression属性是表达式。
我想将Expression(我称之为item)放在属性currentExpression(它是MainForm上的Expression)上。但它总是说“对象与目标类型不匹配”。 TargetException未处理
当我调试时,我可以看到它们都是正确的。 (temp和item)但它仍然会引发异常。
编辑:
我必须说,“List”对象不是List<Something>
,它是要列出的对象,因此List是一个对象(对象列表)。我的用户控件是通用的,这就是我使用反射的原因。
这样我可以拥有objectList1.ShowList(ListExpressions,“OriginalExpression”);
这种情况下ListExpressions是一个List,但作为对象发送给用户控件。通过反射,我可以检查它是哪种类型的List,然后读取属性“OriginalExpression”并显示一个列表。
所以我要有一个属性“OriginalExpression”列表。
用户控件工作正常,问题是使最后一部分工作。当我点击某个项目时,我收到消息“对象与目标类型不匹配。”。
关于如何做到这一点的任何想法?
非常感谢!
答案 0 :(得分:0)
为什么你需要用反射做所有这些?你没有说什么。
这看起来像是一种复杂的写作方式:
var item = this.List[listBox1.SelectedIndex];
var a = this.TopLevelControl;
var temp = a.currentExpression;
temp.currentExpression = item; // ???
除了???
上的GetType()
后,最后一行(我标记为a
)看起来很奇怪,从{{1}的类型中找到属性currentExpression
然后使用 a
作为设置属性的实例(设置为temp
)。以下是我正在谈论的问题:
item
答案 1 :(得分:0)
为什么不这样实现呢:
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if ( listBox1.SelectedIndex != -1 )
{
var item = this.List.Item[listBox1.SelectedIndex];
var mainControl = this.TopLevelControl as IExpressionProvider;
if ( mainControl != null )
mainControl.CurrentExpression = item;
}
}
并在您的主窗体中实现这个简单的界面:
public interface IExpressionProvider
{
YourExpressionType CurrentExpression { get; set; }
}
答案 2 :(得分:0)
我解决了这个问题,
这不是我想要的,但它正在发挥作用!
我改变了
Control a = this.TopLevelControl;
到
mainForm a = (mainForm)this.TopLevelControl;
和
a.GetType().GetProperty("currentExpression").SetValue(temp, (NCalc.Expression)item, null);
到
a.currentExpression = ( NCalc.Expression )item;
这解决了我的问题,因为我避免反思。多谢你们! -