我有个问题; 我正在使用一个外部库,其中一个特定事件有自己的自定义事件参数;没有构造函数。如果我想使用这些 eventargs 抛出我自己的事件,我该怎么做?
如果被问到,我会提供更多细节,但我不确定我应该提供什么。:)
其他答案提出了一些方法(或黑客)如何做到这一点。
但是,我想说,如果库的作者没有给你任何方法来创建他们的自定义EventArgs
类的新实例,那么你不应该这样做。如果你想创建自己的事件,那么你应该定义一个新delegate
的EventArgs
类型(即使你复制了库中已经定义的类)。
这有充分的理由:
EventArgs
它们提供的自定义类型可能不再适合您的需求。EventArgs
,因此您可能无法正确创建实例。由于您只能从定义它的类中触发事件,因此您可能在类中定义了一个新事件(使用event
关键字),因此没有真正的理由不能声明自己的委托。或者您能否提供更多有关您如何触发事件的详细信息?
显然,库的设计者在内部制作了构造函数,以防止你做你想做的事情——无论好坏。因此,您所做的任何事情都将是黑客行为。
您可以使用反射来创建类的实例 - 请参阅Activator.CreateInstance
.
更大的黑客可能是重新使用您接收和存储的 args 对象的实例,但这很危险 - 谁知道它可能包含哪些内部数据。
创建一个从该 EventArgs 类继承的新类型并使用它。现有的 EventArgs 类型很可能是abstract
这样,您可以创建一个继承自它的新类型,并且 C# 的多态支持将允许您将新类型传递给所有需要基类型实例的方法。
使用反射器找出外部库如何实例化它。
您可以尝试使用System.Runtime.Serialization.FormatterServices
. 例子:
public class Foo
{
private Foo()
{
}
}
...
Foo foo = (Foo)FormatterServices.GetSafeUninitializedObject(typeof(Foo));