假设我有一些类定义如下:
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; }
}
}
答案 0 :(得分:5)
好吧,如果你正在使用作曲(就像你一样),那就没有“更简单的方法”;你只需要包装你想要公开的方法。如果要公开组合类型的所有方法,那么为什么首先使用组合?您也可以通过公共属性公开oneClass
和twoClass
,因为它在功能上与包装每个方法和属性/公共字段没有区别。
如果它们属于继承链是有意义的,那么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)
为Class1和Class2创建一个接口,然后让SuperClass实现这些接口。您仍将编写方法调用的代码,但至少您将进行一些编译时检查。也许你也可以在SuperClass中创建一个方法,使用反射调度到适当的类/方法。
另一种方法可能是设置一个继承链,其中SuperClass扩展了扩展Class1的Class2。
答案 6 :(得分:0)
这个问题已经相当陈旧了,今天还有一个解决方案:Expose.Fody。这是Fody的插件,它是一种通用的IL编织工具。引用Expose的描述,
公开成员并可选地实现在类中声明的字段的接口。
只需用属性装饰字段即可。