Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 解决多重继承(针对预编程类)_C# 4.0_Multiple Inheritance_Proxy Classes_Context Bound - Fatal编程技术网

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中的程序集不起作用。