我有问题;我正在使用一个外部库,其中一个特定事件有自己的自定义事件标记;没有构造函数。如果我想使用这些eventargs抛出自己的事件,我该怎么办?
如果被问到,我会提供更多细节,但我不确定我应该给予什么。 :)答案 0 :(得分:6)
其他答案提出了一些方法(或黑客)如何做到这一点。
但是,我要说如果图书馆的作者没有给你任何方法来创建他们的自定义EventArgs
类的新实例,那么你不应该这样做。如果要创建自己的事件,则应定义新的delegate
和新的EventArgs
类型(即使您复制了已在库中定义的类)。
这有充分的理由:
EventArgs
类型可能不再符合您的需求。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));