0

我有个问题; 我正在使用一个外部库,其中一个特定事件有自己的自定义事件参数;没有构造函数。如果我想使用这些 eventargs 抛出我自己的事件,我该怎么做?

如果被问到,我会提供更多细节,但我不确定我应该提供什么。:)

4

5 回答 5

6

其他答案提出了一些方法(或黑客)如何做到这一点。

但是,我想说,如果库的作者没有给你任何方法来创建他们的自定义EventArgs类的新实例,那么你不应该这样做。如果你想创建自己的事件,那么你应该定义一个新delegateEventArgs类型(即使你复制了库中已经定义的类)。

这有充分的理由:

  • 库可能会更改,并且EventArgs它们提供的自定义类型可能不再适合您的需求。
  • 库可能需要将一些特殊对象或特殊 ID 传递给它们EventArgs,因此您可能无法正确创建实例。

由于您只能从定义它的类中触发事件,因此您可能在类中定义了一个新事件(使用event关键字),因此没有真正的理由不能声明自己的委托。或者您能否提供更多有关您如何触发事件的详细信息?

于 2010-04-04T01:20:32.043 回答
1

显然,库的设计者在内部制作了构造函数,以防止你做你想做的事情——无论好坏。因此,您所做的任何事情都将是黑客行为。

您可以使用反射来创建类的实例 - 请参阅Activator.CreateInstance.

更大的黑客可能是重新使用您接收和存储的 args 对象的实例,但这很危险 - 谁知道它可能包含哪些内部数据。

于 2010-04-04T00:56:21.750 回答
1

创建一个从该 EventArgs 类继承的新类型并使用它。现有的 EventArgs 类型很可能是abstract这样,您可以创建一个继承自它的新类型,并且 C# 的多态支持将允许您将新类型传递给所有需要基类型实例的方法。

于 2010-04-04T00:40:08.220 回答
1

使用反射器找出外部库如何实例化它。

于 2010-04-04T00:47:56.313 回答
0

您可以尝试使用System.Runtime.Serialization.FormatterServices. 例子:

public class Foo
{
    private Foo()
    {
    }
}

...

Foo foo = (Foo)FormatterServices.GetSafeUninitializedObject(typeof(Foo));
于 2010-04-04T00:54:58.183 回答