C# 4.0 解决多重继承(针对预编程类)
我需要什么:一个有两个父类的类,它们是C# 4.0 解决多重继承(针对预编程类),c#-4.0,multiple-inheritance,proxy-classes,context-bound,C# 4.0,Multiple Inheritance,Proxy Classes,Context Bound,我需要什么:一个有两个父类的类,它们是ContextBoundObject和另一个类。 为什么:我需要访问contextboundobject来记录方法调用。 构图有效吗?到目前为止,没有(除其他外,无法识别类型)。 还有其他方法可以做到这一点吗?是的,但自动化程度不高,没有第三方组件(也许T4可以做到,但我不是专家)。 更详细的解释。 我需要为父类扩展系统类(其中一些类已经有了MarshalByRefObject(它是ContextBoundObject的父类),例如ServiceBase和F
ContextBoundObject
和另一个类。为什么:我需要访问
contextboundobject
来记录方法调用。构图有效吗?到目前为止,没有(除其他外,无法识别类型)。
还有其他方法可以做到这一点吗?是的,但自动化程度不高,没有第三方组件(也许T4可以做到,但我不是专家)。
更详细的解释。
我需要为父类扩展系统类(其中一些类已经有了
MarshalByRefObject
(它是ContextBoundObject
的父类),例如ServiceBase
和FileSystemWatcher
,还有一些没有,例如Exception
和Timer
)访问框架的一些内部工作,以便记录方法调用(目前;将来可能会更改)。如果我使用这种方式,我只需要向我想要记录的对象添加一个类名,而不是向每个方法添加记录调用,但显然我不能这样做:
public class MyService:ServiceBase,ContextBoundObject,IDisposable{
public MyService(){}
public Dispose(){}
}
所以我们可以尝试通常的解决方案,接口,但是如果我调用Run as in:
ServiceBase.Run(new MyService());
使用IServiceBase接口是行不通的,因为ServiceBase类型不可强制转换为IServiceBase——它不从任何接口继承。异常的问题更为严重:throw
只接受从Exception
递减的类型相反,生成IContextBoundObject接口似乎也不起作用:日志机制不能通过方法工作,因此我不需要实现任何功能,只需要实现一个属性和一些小的内部类(并且继承自
ContextBoundObject
,甚至不继承自MarshalByRefObject
,因为元数据实际上是相同的)
据我所见,从ContextBoundObject
扩展将扩展类放入代理中(可能是因为通过这种方式,方法调用使用SyncProcessMessage(IMessage),因此可以拦截和记录),也许有一种不需要继承的方法可以做到这一点,或者可能有编译前或编译后的技术可用于使用日志调用的方法(如T4文本模板),我不知道
如果有人想看一下,我在程序中使用了自定义版本的MSTestExtensions来记录(方法调用)。
任何想法都会受到欢迎。可能需要更多的解释,请提问。日志方法调用通常使用属性来注释您希望启用日志记录的类或方法。这称为
为此,您需要一个软件来理解这些属性,并通过向已注释的方法/类添加必要的代码来对程序集进行后期处理
对于C#存在。有关介绍,请参阅。在试验代理时,我发现了一种显然可以记录显式调用的方法。
基本上,我创建了一个RealProxy
,如msdn中的示例所示,然后获取TransparentProxy
,并将其用作普通对象。
日志记录在自定义的RealProxy
类中重写的Invoke
方法中完成
static void Main(){
...
var ServiceClassProxy=new ServiceRealProxy(typeof(AServiceBaseClass),new object[]{/*args*/});
aServiceInstance=(AServiceBaseClass)ServiceClassProxy.GetTransparentProxy();
ServiceBase.Run(aServiceInstance);
...
}
在代理类中,调用
将按如下方式完成:
class ServiceRealProxy:RealProxy{
...
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.Infrastructure)]
public override IMessage Invoke(IMessage myIMessage){
// remember to set the "__Uri" property you get in the constructor
...
/* logging before */
myReturnMessage = ChannelServices.SyncDispatchMessage(myIMessage);
/* logging after */
...
return myReturnMessage;
// it could be useful making a switch for all the derived types from IMessage; I see 18 of them, from
// System.Runtime.Remoting.Messaging.ConstructionCall
// ... to
// System.Runtime.Remoting.Messaging.TransitionCall
}
...
}
我仍然需要深入调查,但日志记录发生了。这并不是我最初问题的答案,因为我仍然需要在不是从MarshalByRefObject继承的类上测试这一点。是的,我知道一点AOP,并且使用了PostSharp,但正如我所说的,我不希望使用第三方组件。日志记录我已经完成了完成工作后,问题是如何处理已经“占用”了单一继承的类@lunadir:嗯,你没有。多重继承根本不受支持。你必须找到另一种方法。事实上,我对其他方法的可能性很感兴趣,以完成我已经在做的事情。这是否是AOP并不重要。关键是我如何在现在我无法完成的地方拦截方法调用。@lunadir:你必须使用一些在编译完程序集后重写程序集。这对您自己的程序集来说不是问题,但我认为它对.NET framework中的程序集不起作用。