繁体   English   中英

C#SetValue TargetException对象与目标类型不匹配

[英]C# SetValue TargetException Object Does not match target type

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

我正在尝试做的是:

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

所以我创建了一个事件:

 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。

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

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

编辑:

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

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

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

因此,我将有一个属性“ OriginalExpression”的列表。

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

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

非常感谢!

为什么需要通过反射来完成所有这些工作? 你什么也没说。

看起来是一种复杂的书写方式:

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

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

temp.currentExpression = item; // ???

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

a.GetType().GetProperty("currentExpression").SetValue(temp, item, null);

为什么不以这种方式实现它:

    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; }
}

我解决了这个问题

这不是我要找的东西,但它正在工作!

我改变了

Control a = this.TopLevelControl;

mainForm a = (mainForm)this.TopLevelControl; 

a.GetType().GetProperty("currentExpression").SetValue(temp, (NCalc.Expression)item, null);

a.currentExpression = ( NCalc.Expression )item;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM