如何实例化没有Accessible Constructor的自定义EventArgs类?

时间:2010-04-04 00:37:35

标签: c# eventargs

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

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

5 个答案:

答案 0 :(得分:6)

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

但是,我要说如果图书馆的作者没有给你任何方法来创建他们的自定义EventArgs类的新实例,那么你不应该这样做。如果要创建自己的事件,则应定义新的delegate和新的EventArgs类型(即使您复制了已在库中定义的类)。

这有充分的理由:

  • 图书馆可能会发生变化,他们提供的自定义EventArgs类型可能不再符合您的需求。
  • 库可能需要将一些特殊对象或特殊ID传递给EventArgs,因此您可能无法正确创建实例。

由于你只能从定义它的类中触发一个事件,你可能在类中定义了一个新事件(使用event关键字),所以没有真正的理由让你无法t声明你自己的代表。或者您能提供有关如何触发事件的更多详细信息吗?

答案 1 :(得分:1)

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

答案 2 :(得分:1)

使用Reflector了解外部库如何实例化它。

答案 3 :(得分:1)

显然,图书馆的设计师使构造函数内部阻止你完全按照你要做的 - 无论好坏。所以你做的任何事情都会成为黑客。

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

更大的黑客攻击可能是重用你收到并存储的args对象的实例,但这很危险 - 谁知道它可能包含哪些内部数据。

答案 4 :(得分:0)

您可以尝试使用System.Runtime.Serialization.FormatterServices获取该类的实例。例如:

public class Foo
{
    private Foo()
    {
    }
}

...

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