0

我遇到了一个根本无法解决的问题,我已经研究了几个小时但没有任何结果。请帮忙!

我正在尝试做的事情:

我有一个用户控件,它在我的表单上列出了一个类,如果有人在列表中选择了不同的项目,我希望它在主表单上进行更改。

所以我创建了一个事件:

 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 对象是一个表达式列表。主窗体上的 currentExpression 属性是一个表达式。

我想将表达式(我称之为 item )放在属性 currentExpression (这是 MainForm 上的表达式)上。但它总是说“对象与目标类型不匹配”。TargetException 未处理

当我调试时,我可以看到它们都是正确的。( temp 和 item )但它仍然抛出异常。

编辑:

我必须说,“List”对象不是 a List<Something>,它是要列出的对象,所以 List 是一个对象(对象 List )。我的用户控件是通用的,这就是我使用反射的原因。

这样我就可以拥有 objectList1.ShowList(ListExpressions, "OriginalExpression");

在这种情况下,ListExpressions 是一个列表,但作为对象发送到用户控件。通过反射我可以检查它是哪种类型的列表,然后读取属性“OriginalExpression”并显示一个列表。

所以我会有一个属性“OriginalExpression”的列表。

用户控件工作正常,问题是使最后一部分工作。当我单击一个项目时,我收到消息“对象与目标类型不匹配。”。

关于如何做到这一点的任何想法?

非常感谢!

4

3 回答 3

0

为什么你需要用反射来做这一切?你什么都不说。

它看起来像一种复杂的写作方式:

var item = this.List[listBox1.SelectedIndex];

var a = this.TopLevelControl;
var temp = a.currentExpression;

temp.currentExpression = item; // ???

除了最后一行(我标记的???)看起来很奇怪,因为你GetType()在你的,从类型中a找到一个属性,然后用作设置属性的实例(设置为)。这是我正在谈论的问题中的一行:currentExpressionatempitem

a.GetType().GetProperty("currentExpression").SetValue(temp, item, null);
于 2013-02-20T21:54:09.213 回答
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; }
}
于 2013-02-20T22:14:44.527 回答
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;

这解决了我的问题,因为我避免了反思。多谢你们!–

于 2013-02-25T16:31:09.517 回答