我有一個我想調用的私有方法的結構。由於我打算在關鍵性能部分做到這一點,所以我想緩存一個委託來執行操作。問題是我似乎無法綁定到Delegate.CreateDelegate它的方法。有問題的結構不是我創建的,用於與第三方庫的交互。 有問題的結構看起來像這樣::如何從結構的實例方法創建一個開放的委託?
public struct A
{
private int SomeMethod()
{
//body go here
}
}
而下面的代碼將失敗,一個「錯誤綁定到目標方法」。
Delegate.CreateDelegate(typeof(Func<A,int>),typeof(A).GetMethod("SomeMethod",BindingFlags.Instance | BindingFlags.NonPublic));
我知道我可以寫一個表達式樹要執行的操作,但它似乎很奇怪,我不能用我的正常轉到這些東西Delegate.CreateDelegate
方法。
如果A
是一個類,上面的代碼工作得很好。這個問題只是因爲A
是一個結構。 對於CreateDelegate的重載,MSDN文檔不正確,因爲它在非靜態方法上工作。
出於好奇,爲什麼要使用結構實例方法?使用結構實例方法創建委託將有效地需要裝箱結構以便使用它,於是盒裝結構實例將有效地表現爲類類型。爲什麼不直接使用類(即使類只包含一個結構類型的字段)? – supercat 2013-02-01 23:47:42
這是一個老問題,但結構來自第三方庫。但是,使用委託不會複製它,因爲結構實例方法是「by-ref」。我需要在他們給我的句柄上調用一個方法。因爲他們只是在最後叫它,但我想早些時候做(我不記得)。 – 2013-02-05 15:58:46
我想如果你打算將結構方法視爲一個靜態方法,它採用`ref`參數(而不是從未綁定委託創建綁定委託),你可以避免裝箱,儘管在這種情況下我認爲使用靜態結構方法會更清晰。 – supercat 2013-02-05 16:15:08