【问题标题】:Same method but different signature depending on .NET framework version?相同的方法但不同的签名取决于 .NET 框架版本?
【发布时间】:2015-12-19 09:40:48
【问题描述】:

呃,抱歉标题不好,真的不知道什么是正确的(如果您看到更合适的内容,请更改)。

我有一个 DLL 文件,用于基于 WinRT 的项目(或者更确切地说,我在构建 Universal Windows 10 应用程序时使用它),我还将它用于“普通”桌面应用程序。但我的问题是我使用System.Activator.CreateInstance<T>(typeof(T), true) 能够使用私有构造函数创建一些类。这适用于桌面应用程序。但在 WinRT 上,方法 CreateInstance<T>(...) 不采用相同的参数。解决这个问题的最佳方法是什么?

我可以在运行时检查我是在 WinRT 上还是“正常”应用程序?并基于此使用适当的签名?

(抱歉,如果我使用 WinRT 等这个词是错误的,我很难理解所有这些通用应用程序术语是什么)

【问题讨论】:

  • 为什么你认为它有不同的签名? (我不是 WinRT 方面的专家,但这似乎很不寻常。)
  • 我知道它有不同的签名。因为我打开了一个 WinRT 项目,并且只有 3 个可用的签名。虽然桌面版有 13 个。几周前我还看到了一条评论(巧合),应该注意的是,情况就是这样(虽然找不到了)。 :)
  • 我认为 WinRT 不支持这种重载。您可以调用CreateInstance(Type),但CreateInstance(Type, bool) 不可用,可能是由于沙盒安全限制。
  • 是的,肖恩,我认为这就是我在帖子中所说的。但是我能做些什么来解决它?你是说我唯一的选择是只使用 CreateInstance(Type)?
  • @user2422321 - 你不走运因为CreateInstance(Type) 方法需要一个公共构造函数。您可能应该首先探索为什么需要使用私有构造函数创建类的副本。

标签: c# .net windows-runtime win-universal-app uwp


【解决方案1】:

由于沙盒安全限制,CreateInstance(Type, bool) 重载在 WinRT 中不可用,这只会让您使用 CreateInstance(Type) 重载。但是,这不允许您创建具有私有构造函数的类的实例。

您可能应该首先探索为什么需要使用私有构造函数创建类的副本。该类的作者并不打算让第三方使用它,因此创建实例是有风险的。如果该类具有受保护的构造函数,那么您始终可以从该类派生并为您的新类提供一个公共构造函数。如果它是私人的,那么你就不走运了!一种选择可能是联系课程的作者,并要求他们将其公开,如果可能的话。

【讨论】:

  • 感谢肖恩的解释。我实际上是具有私有构造函数的类的作者,并希望阻止创建它们。它们是私有的,因为它们以通用的 Singleton/Factory 方式使用。 :)
猜你喜欢
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多