如何*容易地*暴露底层对象的方法

本文关键字:对象 方法 暴露 易地 如何 | 更新日期: 2023-09-27 18:09:24

假设我有一些定义如下的类:

class Security
{
    Boolean AuthenticateUser(String username, String password);
    Boolean AddUser(String username, String password);
    // many more methods
}
class NetworkedDevice
{
    void Stop();
    void Start();
    // many more methods
}

然后我有另一个类,它包含上述类的实例。我怎样才能避免像下面这样的代码?我想通过这个类公开class1和class2的所有方法。

class MyWindowsService
{
     Security _security = new Security();
     NetworkDevice _netDevice = new NetworkDevice();
     Boolean AuthenticateUser(String username, String password)
     {
          return _security.AuthenticateUser(username, password);
     }
     // all the rest of "Security" methods implemented here
     void StopNetworkDevice()
     {
          _netDevice.Stop();
     }
     void StartNetorkDevice()
     {
          _netDevice.Start();
     }
     // all the rest of "NetDevice" methods implemented here
}

编辑我已经更新了代码更真实我正在做什么。我在一个windows服务中托管一个WCF服务。windows服务做了几件事,包括用户身份验证和与网络设备的通信等等。我的WCF接口的实现调用了"MyWindowsService"类的方法。将底层对象暴露为属性是我一直在寻找的答案。上面的类看起来像:

class MyWindowsService
{
     SecurityClass _security = new SecurityClass();
     NetworkDevice _netDevice = new NetworkDevice();
     Public NetworkDevice NetDevice
     {
          get { return _netDevice; }
     }
     Public SecurityClass Security
     {
          get { return _security; }
     } 
}

如何*容易地*暴露底层对象的方法

好吧,如果你正在使用合成(就像你一样),没有更简单的方法了。您只需要包装要公开的方法。如果您想公开组合类型的所有方法,那么为什么要首先使用组合呢?你也可以通过公共属性暴露SecurityClassNetworkDevice,因为它在功能上与包装每个方法和属性/公共字段没有什么不同。

如果它们属于继承链中有意义,那么SuperClass(奇怪的命名,因为它将是一个子类…)应该继承这些类中的一个。当然,你不能在c#中继承两者,但是这种设计让我怀疑可能有更好的整体方法。这是不可能从你的代码示例中告诉我们,虽然你没有告诉我们你实际上试图完成这些类型。

还有一种方法:T4模板。详见:http://msdn.microsoft.com/en-us/data/gg558520

生成的CS文件在构建时生成。这意味着你可以使用重选来循环你的类,结果将是你现在在"SuperClass"中手动创建的。

结果代码是动态生成的,而且是类型安全的。

值得这么做吗?我不知道。这取决于你在做什么以及为什么要做。

我们用它来翻译Func<T1, T2>为"真正的"委托和自动生成包装类的方式。

不幸的是,没有神奇的方法可以做到这一点,因为。net中不允许多类型继承。

在c#中不容易做到这一点。您可以从其中一个类继承,并为另一个类创建委托,或者您可以手动为两个类创建委托(通过委托,我只是指委托给成员对象的方法,与delegate关键字或类无关)。

如果你使用Resharper这样的产品,Refactor菜单中有一个选项可以自动执行这个过程,叫做"Create delegate…"

可以将class1设为public,然后直接引用它们:

SuperClass.class1.MethodFirst();

当然,静态方法是可以的,您必须为实例方法构造class1。

在c#中,你不能像在Java中那样组合类层次结构,但你可以通过接口强制执行契约。

为Class1和Class2创建一个接口,然后让SuperClass实现这些接口。您仍然需要编写方法调用的代码,但至少需要进行一些编译时检查。也许你也可以在SuperClass中创建一个方法,使用反射分派到适当的类/方法。

另一种方法可能是建立继承链,其中SuperClass扩展Class2,而Class2扩展Class1。

这个问题已经很老了,现在还有一个解决方案:Expose.Fody。这是Fody的一个插件,Fody是一个通用的il编织工具。要引用Expose的描述,

公开成员,并可选地实现类中声明的字段的接口。