【问题标题】:Can I "add" static methods to existing class in the .NET API?我可以将静态方法“添加”到 .NET API 中的现有类吗?
【发布时间】:2013-03-22 21:11:29
【问题描述】:

我想使用来自常规 .NET Framework 类库的源代码构建一个 Windows 应用商店类库。理想情况下,我不想修改原始源代码文件。

.NET Framework 库 中的一些源代码文件中,静态成员用于在常规 .NET Framework API 和.NET for Windows Store apps API,但只有 .NET Framework 成员的子集可用于 Windows Store

一个具体示例是System.IO.Path,其中GetFullPath method 不适用于Windows 应用商店应用

在我的 Windows 应用商店类库 中合并此方法的替代项并让原始源代码调用此方法是相当简单的。我的问题是,有没有任何方法可以在不修改原始源代码文件的情况下做到这一点?

到目前为止,我还没有找到一个令人满意的解决方案来解决这个问题,但是我已经为我的 Windows Store 类库 解决了这个问题,例如实现了另一个命名空间中的Path.GetFullPath(string) 方法:

namespace WindowsStoreLib.System.IO {
    public static class Path {
        public static string GetFullPath(string path) { ... }
    }
}

然后在原始文件中添加预处理指令:

#if NETFX_CORE
using Path = WindowsStoreLib.System.IO.Path;
#endif

对于这个问题,有没有不需要需要修改原始源代码文件的替代解决方案?

【问题讨论】:

  • 制作两个版本的库,一个重新实现所需的东西,另一个只调用本机版本,并根据应用程序的版本包含不同的版本。
  • 简短的回答是:不,您不能向现有类添加静态方法。
  • @millimoose 我希望能够在不修改的情况下重用基于 .NET Framework 的库中的原始源代码,例如在这些文件中使用 Path.GetFullPath()
  • 适配器模式可能对您有所帮助。

标签: c# .net windows-runtime windows-store-apps


【解决方案1】:

不,你不能,只是。

当我在做跨平台的事情时,我倾向于为不同的平台编写一个具有不同实现(通过#if)的实用程序类 - 然后我的核心代码只调用实用程序类。

【讨论】:

  • 谢谢,马克。是的,我自己通常使用“实用程序类”方法,但我有点希望我忽略了一些东西 :-) 显然没有,但至少获得独立确认是件好事。
【解决方案2】:

我最近一直在使用 Entity Framework 类做类似的事情,因为我需要将 2 个字段的特定输出添加为 1,并且每次更新时都会将其从 Designer.cs 中清除。但是它们不是静态类或静态方法,但应该与它们一起工作。

使用要扩展的类的名称创建一个新的类文件并使用部分限定符。

namespace WindowsStoreLib.System.IO {
    public partial static class Path {

       public static string GetFullPath(string path) { ... }
    }
}

【讨论】:

  • 谢谢,@lostcny。问题是我将能够引用该方法(甚至构建库),即使它在部分类中,除非我修改原始源代码文件。而修改是我想要避免的。
【解决方案3】:

正如 Marc 所说,预处理器指令似乎是唯一的解决方案。

但是当我阅读“静态类”和“现有类”时,首先想到的是“扩展方法”。如果您在代码所在的同一命名空间中为 Path 创建了扩展方法会发生什么?

namespace MyNamespace.WhereMyCodeIs
{
    using System.IO;

    public static class ExtensionMethods
    {
        public static string GetFullPath(this Path pathObject, string path) 
        {
            // Implementation
        }
    }
}

我真的不确定这是否可行,但也许我们可以找到解决方法。

【讨论】:

  • 扩展方法仅适用于实例。您不能使用它们来使现有类看起来像是有新的静态方法(尽管有很多次我希望您可以这样做)。
  • 哦,是的,完全正确。我也多次希望如此。算了!
  • 谢谢,@Ucodia,但正如 Joe 指出的(谢谢,Joe),您需要一个实例来使用扩展方法。我已经考虑过了,但也无法使用扩展方法提出可行的解决方案。
猜你喜欢
  • 2010-09-19
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
相关资源
最近更新 更多