2012-06-01 94 views
0

所以我開始時沒有關於反射或動態打字的知識,但我學到了很多東西。但是,有一件事我找不到:動態類型的「as」等價物。「as」使用反射

我想要做的就是這相當於(如果它會編譯):

foreach (Change c in changes) 
{ 
    (c.Undo as Action<c._Type, c._Type>).Invoke(
     c.OldValue as c._Type, c.NewValue as c._Type); 
} 

據我瞭解,我需要沿着

Type constructedClass = typeof(Action<,>).MakeGenericType(c._Type); 
線做一些事情

來構建所需的Action類,但是有沒有一種方法可以爲Action類型和c._Type實現as

爲了進一步澄清,這裏是僞代碼(這是我第一次嘗試做這樣的事情,所以請很好):提前

foreach (Object o in objects) 
{ 
    (o.SettableMethod as Action<o.TypeOfParameters, o.TypeOfParameters>).Invoke(
     o.Parameter1 as TypeOfParameters, o.Parameter2 as TypeOfParameters); 
} 

感謝。

+2

目前還不清楚你想要什麼可以給你一個用法示例 –

+0

原因有點複雜,但我將c.Undo(它應該是一個Action )作爲一個對象,以及它的OldValue和NewValue。我正在嘗試分配他們正確的類型。還有一堆其他的代碼,我不知道哪一個是有用的。 – benjer3

+0

只需在僞代碼中發佈一個樣本,您正在嘗試做什麼 –

回答

1

Action(或通常)上的泛型的目的是讓您在編譯時管理類型安全。如果你使用反射,你正在做額外的工作,以而不是得到的好處。如果需要,您可能還需要使用撤銷操作的簽名獲取object類型的兩個對象,並將其轉換爲操作內部的適當類型。

更普遍的是,你會更好地服務於不同的設計。你爲什麼要調用Change的方法來發送Change的屬性?你是否可以不帶任何參數調用撤消,並且讓Change負責知道新舊值是什麼?

+0

不同的設計可能是有益的,但這是唯一的方法我可以考慮去做。我想要做的是設置一組可以處理撤銷和重做的類,而不必爲每種可能的類型製作大量的類。當然,不同的類型會讓你覺得泛型,但是我遇到了逆變的問題並試圖繞過它。 c.Undo是一種方法,我將c作爲參數來定義它應該如何撤消每個更改。它沒有定義;我在創建Change對象時給它一個定義。 – benjer3

+0

你仍然可以擁有它的簽名需要兩個對象。這就是所有這些方法在泛型之前的使用方式;泛型被添加來使類型安全更容易。這種方式沒有獲得安全類型。 – tallseth

+0

撤消操作是否必須執行一些操作,而不是使用oldVal替換newVal?另一種設計是讓它做到這一點。這意味着讓您的撤消對象存儲所有您想要更改的有趣狀態信息的Memento對象。 – tallseth