C# - 覆盖System命名空间中可用的某些类

时间:2011-03-16 19:19:43

标签: c# frameworks namespaces compact-framework

我有一个需要在Compact .NET Framework 3.5和.NET Framework 3.5中编译的项目(事实上只有2个项目,只是编译两者之间发生变化的选项)。

问题是,CF .NET中缺少某些类,因此我手动创建了它(并实现了.NET中所有类的所有成员

一个例子:FtpWebRequest / FtpWebResponse类。

写这样的东西是不好的(如果是,为什么?):

#if CFNET35 // Only if we are in Compact Framework 3.5 mode
namespace System.Net
{
    public class FtpWebRequest : WebRequest
    {
        // ...
    }

    public class FtpWebResponse : WebResponse
    {
        // ...
    }
}
#endif

我确信在CF.NET35中这些方法永远不可用,所以我可以写它吗?

我会写这个是为了避免在项目中使用my库时发生名称冲突。

它允许我在其他项目中始终using System.Net; whitout问我使用哪个框架......

谢谢!


修改

几个月后,我会评估我使用的策略。

如上所述,我通过进行条件编译来覆盖System(.Net)命名空间,所以我有两个DLL(一个用于CF.NET,一个用于.NET)

这也包括我使用此DLL的所有应用程序都是双重的(每次都是CF.NET应用程序和一个包含相应库的.NET应用程序)。

所以,这是一个坏主意,我有很多项目是双重的,而且.NET应用程序可以直接包含和使用CF.NET库的方式是不必要的。

此外,我还没有注意的是,如果一个.NET应用程序包含一个带有覆盖系统名称空间的CF.NET库,那么它的初始化将因类名冲突而失败...

所以, EPIC FAIL ,提供通用界面是管理此案例的最佳方式。

4 个答案:

答案 0 :(得分:6)

我可能会避免使用System命名空间来编写自定义代码。我见过尝试这样做的开源库,它通常会导致头疼。

您可能最好创建一个在完整框架和紧凑框架之间共享的接口,然后在完整和CF中实现接口,使用内置的System类或您自己编写的类来提供所需的功能。 / p>

这看起来有点矫枉过正,但如果System.Net中的某些内容发生变化,您将来会更安全。您的调用代码应该只引用该接口,您可以根据您所在的平台插入任一实现。

// Shared interface
public interface IFtpUtil
{
    SomeFileObject GetFile(SomeArgument a);
    void PutFile(SomeFileObject f, SomeArgument a);
}

// Full framework implementation
public class FullFtpUtil : IFtpUtil
{
    public ... GetFile(...)
    {
        // Use System.Net classes from full framework
    }

    public ... PutFile(...)
    {
        // Use System.Net classes from full framework
    }
}

// Compact framework implementation
public class CompactFtpUtil : IFtpUtil
{
    public ... GetFile(...)
    {
        // Use your own FTP classes
    }

    public ... PutFile(...)
    {
        // Use your own FTP classes
    }
}

答案 1 :(得分:5)

我不会这样做;不是因为任何具体的技术原因,而是因为它可能会引起一些重大的混乱。 没有人希望自定义类驻留在System命名空间中。

System命名空间中的类已经过广泛测试并被许多人使用,因此,如果您团队中的其他人在其代码中使用System.Net.FtpWebRequest并且他们的代码无效,他们会(并且应该首先在自己的代码中搜索错误。经过几个小时的搜索,当他们发现错误出现在显然内置的系统类中时,他们会生你的气。

答案 2 :(得分:1)

我意识到我对这个问题迟到了,但我认为我可以增加一些价值,因为我们做了很多。对于与桌面框架匹配的类,SDF可能是50%的填充。我们所做的是使用我们自己的命名空间。让我们以Ftp为例。我们这样做:

namespace OpenNETCF.Net

public class FtpWebRequest  { ... }

消费者应用会使用别名来解决这个问题:

#if NETCF
using FtpWebRequest = OpenNETCF.Net.FtpWebRequest;
#else
using FtpWebRequest = System.Net.FtpWebRequest;
#endif

void Foo()
{
    // the alias above resolves these for you
    // enabling a single, fairly clean code base
    var request = new FtpWebRequest(...);
}

答案 3 :(得分:0)

有类似的情况。想要在winforms框架中使用一些名称空间/类可用,但是,从移动框架中删除。

我建议不要将你的命名空间放在“系统”命名空间中,但我建议设计你的代码,尽可能与框架类似,除非你的应用程序。需要特定的附加功能。

using system;

// "sysmobile" emulates code for the "system" namespace

namespace sysmobile {
  class FtpWebRequest { ... }
  class FtpWebResponse { ... }
}