2013-02-20 56 views
0

我遇到了一個我根本無法解決的問題,我一直在研究幾個小時但沒有結果。請幫忙!C#SetValue TargetException對象與目標類型不匹配

我想要做的事:

我有一個用戶控件,列出我的形式一類,我想它,如果有人選擇列表上的不同項目主窗體上的變化。

所以我創建了一個事件:

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<Something>,它是要列出的對象,所以列表是一個對象(對象列表)。我的用戶控件是通用的,這就是爲什麼我使用反射。

這樣我可以有objectList1.ShowList(ListExpressions,「OriginalExpression」);

這是什麼情況ListExpressions是一個List,但作爲一個對象發送給用戶控件。通過反射,我可以檢查它是哪種類型的List,然後閱讀屬性「OriginalExpression」並顯示一個列表。

所以我要列出屬性「OriginalExpression」。

用戶控制工作正常,問題是使這最後一部分的工作。當我點擊一個項目時,我得到這個消息「對象與目標類型不匹配」。

關於如何做到這一點的任何想法?

非常感謝!

+0

當你調試什麼是每個類型..不管你是否可以看到這兩個..錯誤幾乎解釋了什麼是問題... – MethodMan 2013-02-20 21:32:53

+0

你能顯示究竟是什麼是這個列表的定義?爲什麼你需要思考呢? – 2013-02-20 21:43:32

+0

對不起,我以前不能回答,列表對象不是必需的列表,它是要列出的對象,因此列表是一個對象(對象列表)。我的用戶控件是通用的,這就是爲什麼我使用反射。 這是否有意義,或者我應該考慮另一種實現? – Roiw 2013-02-22 18:52:47

回答

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; 

這解決了我的問題,因爲我避免了反思。多謝你們! -

0

爲什麼你需要用反射來做這一切?你什麼也沒有說。

它看起來像寫作的一個複雜的方式:

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

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

temp.currentExpression = item; // ??? 

除了最後一行(這標誌着我???)看起來很奇怪,因爲在你的aGetType(),從a找到屬性的類型currentExpression,然後使用temp作爲要設置屬性的實例(設置爲item)。下面是你的問題我談論行:

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

我有一個用戶控件,它填充了列表框中的對象列表。 – Roiw 2013-02-21 05:30:52

+0

對不起,我以前不能回答, 列表對象不是必需的LIST它是列出的對象,因此List是一個對象(對象列表)。我的用戶控件是通用的,這就是爲什麼我使用反射。 – Roiw 2013-02-22 18:42:24

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

對不起,我以前不能回答,列表對象不是必需的列表,它是列出的對象,因此列表是一個對象(對象列表)。我的用戶控件是通用的,這就是爲什麼我使用反射。 – Roiw 2013-02-22 18:44:10

相關問題