2011-09-20 67 views
1

比方说,我有定义了一些类如下:如何*轻松*揭露底层对象的方法?

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; } 
    } 
} 
+1

如果您公开所有方法,为什么不公开该成员? – FishBasketGordo

+1

你能告诉我们更多关于你试图解决的问题吗?可能有更好的方法... –

回答

5

那么,如果你正在使用组合(就像你一样)没有“简单的方法”;你只需要包装你想要公开的方法。如果你想公开所有组合类型的方法,那么你为什么首先使用组合?你也可以通过公共财产披露oneClasstwoClass,因为它在功能上与包装每一种方法和财产/公共领域没有区别。

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

0

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

0

你不能在C#中轻松完成此操作。你可以从其中一个类继承,为另一个类创建委托,或者你可以手动为它们创建委托(通过委托,我只是指一种委托给成员对象的方法,而不是关于delegate关键字或类的任何操作)。

如果您使用的产品这样的ReSharper的,有在重构菜单中的选项,将这个过程自动化,叫做“创建代表......”

0

您可以Class1的公开,然后直接引用它们:

SuperClass.class1.MethodFirst(); 

当然,静态方法会好的,你必须为实例方法构造class1。

0

在C#中,您不能像Java那样组合类层次结构,但可以通过iterfaces强制执行合同。

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

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

+0

如果你只是要包装这些对象的每一个方法/属性/字段,它是矫枉过正;你也可以直接暴露对象本身。 –

1

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

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

真的很酷的是,生成的代码是即时生成的,它是类型安全的。

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

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

0

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

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

它只需要用属性装饰该字段。