我有一個特殊的情況。我需要重寫一個庫,但我沒有原始代碼。為了使討論更加清晰,我們把這個庫稱為 HandlerLibOld 和 HandlerLibNew。
我想制作 HandlerLibNew,它將取代 HandlerLibOld.
。我有一個使用該庫的應用程式,它是一個大型的應用程式,對該庫有1000次呼叫。 我不希望改變應用程式的代碼。
示例應用程式代碼
public class MyMessage : MyBaseClass
{
public int ValueA {get; set; }
public int ValueB {get; set; }
}
public class MyOtherMessage : MyBaseClass
{
public int ValueC {get; set; }
public int ValueD {get; set; }
}
public class Sender
{
Handler handler = new Handler()。
handler.Send<MyMessage>(m => { m.ValueA=10; m.ValueB=20; }) 。
注意這一行 也許我誤解了lambda運算式的作用,但重點是我需要告訴Handler.Send關于ValueA和ValueB的值。
現在我想撰寫 我的嘗試 我嘗試了: 我還試過: 我知道這在某種程度上是可能的,因為這在HandlerLibOld中是可行的。我怎樣才能用HandlerLibNew實作同樣的效果?我無法訪問 HandlerLibOld 的代碼。
uj5u.com熱心網友回復: 為了讓這個Action發揮作用,你必須有一個T的實體來開始: 現在,如果T有一個約束條件,比如實作了某個介面,你就可以在物件本身上做更多的事情。如果你使用基類,你必須小心地對待物件的切分。
標籤: 上一篇:如何驗證geojson中的屬性鍵
handler.Send<MyMessage>(m => { m.ValueA=10; m.ValueB=20; });/code>。它使用一個lambda運算式來定義一個MyMessage的物件,并設定這個物件的兩個屬性。請注意,我不需要修改這段代碼。
Handler的Send方法的實作。棘手的部分是,lambda運算式使它成為一個動作,但我想獲得MyMessage物件實體。我怎樣才能做到這一點呢?我是否需要以某種方式使用反射?
public class Handler
{
public void Send< T>(Action<T>actionmessage)。
{
// actionmessage是一個Action<T>型別的物件,。
// I want to get the object of type T that was passed into the method.
}
}
public class Handler
{
public void Send< T>(T message)
{
// This will not compile. 我得到:
//不能轉換lambda運算式。
// to type 'object' because it is not a delegate type。
}
}
public void Send< T>(Action< T> actionMessage)
where T: new()
{
var input = new T()。
actionMessage(input)。
/T現在已經填充了valueA和valueB。
//對輸入的T做更多處理。
//send。
}
