【发布时间】:2021-07-30 06:46:19
【问题描述】:
我有一个 Uno Platform 应用程序,基于 WebAssembly 上的 .NET 5 构建。
我有一个库,每次单击 Toast 通知时都会构造一个 ToastNotificationActivatedEventArgs,并调用 Application.Current 的 OnActivated 方法。由于某些原因,该类没有可见的构造函数,无论是通过代码还是通过反射(GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Count() 返回 0)虽然声明了一个 here。
所以我使用FormatterServices.GetUninitializedObject 创建了对象,并使用反射初始化了每个字段。然而,在那之后,奇怪的事情开始发生。
protected override void OnActivated(IActivatedEventArgs e)
{
// Prints True.
Console.WriteLine(e.GetType() == typeof(ToastNotificationActivatedEventArgs));
// Gives a valid object.
var obj1 = (ToastNotificationActivatedEventArgs)e;
// Prints False.
Console.WriteLine(e is ToastNotificationActivatedEventArgs);
// Gives null
var obj2 = e as ToastNotificationActivatedEventArgs;
}
我怀疑FormatterServices.GetUnitializedObject 一定做错了什么,但是当我尝试使用普通的 .NET 5 复制它时,nothing happened。类型被正常解析。
那么我在这里做错了什么?我知道滥用反射并将FormatterServices 用于反序列化以外的东西并不好,但这是我知道的唯一方法,因为我必须接触一些内部函数才能从外部库复制 UWP 中的行为。
【问题讨论】:
-
我认为构造函数根本不存在,因为它没有在任何地方使用并且它是内部的,因此链接器将其删除。但是 - 我很好奇 - 外部库如何调用
OnActivated方法?您是否可以创建一个实现IActivatedEventArgs的自定义类并改用它? -
@MartinZikmund 是的,它是内部的,但不保证它不能在任何地方使用,因为据我所知,
Uno.UI有一堆InternalsVisibleTo属性。关于OnActivated,因为它是protected,外部库无法从代码中调用它:我使用反射来创建EventArgs的实例并调用OnActivated。 -
@MartinZikmund 由于跨平台代码期待
Windows.UI.Notifications.ToastActivatedEventArgs,我怀疑自定义类是否可行。即使它起作用了,我仍然不得不打乱反射来打电话给OnActivated。 -
BindingFlags.Private 是 BindingFlags.NonPublic 的错字吗(这是您内部需要的)?我想应该是吧?
标签: c# .net-5 webassembly uno-platform