我有一個問題;我正在使用外部庫,其中一個特定事件有自己的自定義事件標記;沒有構造函數。如果我想用這些eventargs拋出我自己的事件,我該怎麼辦?如何實例化不具有可訪問構造函數的自定義EventArgs類?
我會給更多的細節,如果問,但我不知道我應該給予什麼。 :)
我有一個問題;我正在使用外部庫,其中一個特定事件有自己的自定義事件標記;沒有構造函數。如果我想用這些eventargs拋出我自己的事件,我該怎麼辦?如何實例化不具有可訪問構造函數的自定義EventArgs類?
我會給更多的細節,如果問,但我不知道我應該給予什麼。 :)
其他答案提出了一些方法(或黑客)你可以做到這一點。
但是,我想說,如果圖書館的作者沒有給你任何方式來創建他們的自定義EventArgs
類的新實例,那麼你不應該這樣做。如果你想創建自己的事件,那麼你應該定義一個新的delegate
和新的EventArgs
類型(即使你正在複製已經在庫中定義的類)。
有很好的理由:
EventArgs
類型可能不再滿足您的需求。EventArgs
,因此您可能無法正確創建實例。既然你只能觸發並從那裏被定義的類的事件,你可能定義在類新事件(使用event
關鍵字),所以沒有真正的理由,你爲什麼不能申報你自己的代表。或者你能否提供更多關於你如何觸發事件的細節?
創建一個從該EventArgs類繼承並使用它的新類型。很可能現有的EventArgs類型爲abstract
,因此您可以創建一個新的類型以繼承它,並且C#的多態支持將允許您將新類型傳遞給期望基類型實例的所有方法。
使用Reflector來了解外部庫如何實例化它。
您可以嘗試使用System.Runtime.Serialization.FormatterServices
獲取該類的實例。例如:
public class Foo
{
private Foo()
{
}
}
...
Foo foo = (Foo)FormatterServices.GetSafeUninitializedObject(typeof(Foo));
顯然,圖書館的設計師所做的內部構造,以防止你做你想要什麼做的 - 或好或壞。所以你做的任何事情都會成爲黑客。
您可以使用Reflection創建類的實例 - 請參閱Activator.CreateInstance
。
甚至更大的黑客可能會重新使用您接收和存儲的args對象的實例,但這很危險 - 誰知道它可能包含哪些內部數據。
這是假設圖書館的設計者知道他們在做什麼。我看到我的公平份額沒有。 – Nuzzolilo 2014-05-24 04:53:00
啊,我已經試過了。首先;我想用我的繼承類的構造函數設置的成員對於父類是私有的,其次,它不允許我在繼承類中創建構造函數。 此外,自定義類不是抽象的,我想,因爲我使用它的實例。 – Xenoprimate 2010-04-04 00:44:16