2010-04-04 58 views

回答

6

其他答案提出了一些方法(或黑客)你可以做到這一點。

但是,我想說,如果圖書館的作者沒有給你任何方式來創建他們的自定義EventArgs類的新實例,那麼你不應該這樣做。如果你想創建自己的事件,那麼你應該定義一個新的delegate和新的EventArgs類型(即使你正在複製已經在庫中定義的類)。

有很好的理由:

  • 庫可能會改變,他們提供定製EventArgs類型可能不再滿足您的需求。
  • 庫可能需要傳遞一些特殊對象或特殊ID到它們的EventArgs,因此您可能無法正確創建實例。

既然你只能觸發並從那裏被定義的類的事件,你可能定義在類新事件(使用event關鍵字),所以沒有真正的理由,你爲什麼不能申報你自己的代表。或者你能否提供更多關於你如何觸發事件的細節?

1

創建一個從該EventArgs類繼承並使用它的新類型。很可能現有的EventArgs類型爲abstract,因此您可以創建一個新的類型以繼承它,並且C#的多態支持將允許您將新類型傳遞給期望基類型實例的所有方法。

+0

啊,我已經試過了。首先;我想用我的繼承類的構造函數設置的成員對於父類是私有的,其次,它不允許我在繼承類中創建構造函數。 此外,自定義類不是抽象的,我想,因爲我使用它的實例。 – Xenoprimate 2010-04-04 00:44:16

1

使用Reflector來了解外部庫如何實例化它。

0

您可以嘗試使用System.Runtime.Serialization.FormatterServices獲取該類的實例。例如:

public class Foo 
{ 
    private Foo() 
    { 
    } 
} 

...

Foo foo = (Foo)FormatterServices.GetSafeUninitializedObject(typeof(Foo)); 
1

顯然,圖書館的設計師所做的內部構造,以防止你做你想要什麼做的 - 或好或壞。所以你做的任何事情都會成爲黑客。

您可以使用Reflection創建類的實例 - 請參閱Activator.CreateInstance

甚至更​​大的黑客可能會重新使用您接收和存儲的args對象的實例,但這很危險 - 誰知道它可能包含哪些內部數據。

+0

這是假設圖書館的設計者知道他們在做什麼。我看到我的公平份額沒有。 – Nuzzolilo 2014-05-24 04:53:00

相關問題