如何*轻松*暴露底层对象的方法?

时间:2011-09-20 18:48:15

标签: c# .net

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

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
}

修改的 我已经将代码更新为 real 到我正在做的事情。我在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; }
     } 
}

7 个答案:

答案 0 :(得分:5)

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

如果它们属于继承链是有意义的,那么SuperClass(奇怪地命名为它将是一个子类......)应该继承其中一个类。当然你不能从C#继承,但这种设计让我怀疑可能有更好的整体方法。虽然您没有告诉我们您实际尝试使用这些类型完成的任务,但您无法从代码示例中判断出来。

答案 1 :(得分:1)

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

生成的CS文件是在构建时生成的。这意味着您可以使用refelection循环您的类,结果将是您现在在“SuperClass”中手动创建的结果。

很酷的是,生成的代码是动态生成的,它是类型安全的。

值得努力吗?我不知道。这真的取决于你在做什么以及你为什么这样做。

我们使用它来将Func<T1, T2>转换为“真正的”委托并自动生成包装类。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

你不能在C#中轻松做到这一点。您可以继承其中一个类,并为另一个类创建委托,或者您可以手动为两者创建委托(通过委托,我只是指委托给成员对象的方法,而不是与{{1}有关的任何方法}关键字或类)。

如果您使用Resharper等产品,Refactor菜单中会有一个选项可以自动执行此过程,称为“创建委托...”

答案 4 :(得分:0)

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

SuperClass.class1.MethodFirst();

当然,静态方法也可以,你必须为实例方法构造class1。

答案 5 :(得分:0)

在C#中,您无法以Java的方式组合类层次结构,但您可以通过iterfaces强制执行合同。

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

另一种方法可能是设置一个继承链,其中SuperClass扩展了扩展Class1的Class2。

答案 6 :(得分:0)

这个问题已经相当陈旧了,今天还有一个解决方案:Expose.Fody。这是Fody的插件,它是一种通用的IL编织工具。引用Expose的描述,

  

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

只需用属性装饰字段即可。