如何在c#中继承非继承属性

Posted

技术标签:

【中文标题】如何在c#中继承非继承属性【英文标题】:How to inherit non-inherited attribute in c# 【发布时间】:2017-12-18 11:07:56 【问题描述】:

这是我的情况:

    我有一个基类和 70 个交付的类,它们继承自 这个。 我正在实现 WCF 命名管道,这 70 个类将是 客户。 需要异步接收和发送数据

对于第三篇文章,我使用[CallbackBehaviorAttribute(ConcurrencyMode = ConcurrencyMode.Multiple)] 属性,当我将它插入到交付的课程中时它可以工作。但是我应该在基类上插入属性,我不会花时间在所有交付的类上插入新属性或删除现有属性。但是当我插入基类时,它不能异步工作。因为CallbackBehaviorAttribute不是继承属性。

那么我该如何解决我上面提到的问题呢?我试图创建一个继承自CallbackBehaviorAttribute 的新属性,但它是密封的。

客户代码:

[CallbackBehaviorAttribute(ConcurrencyMode = ConcurrencyMode.Multiple)]
public abstract partial class BaseService : IDownloaderCallbackService

    public void connect_server_manager()
    
        string address = "net.pipe://localhost/servermanager/";
        var factory = new DuplexChannelFactory<IDownloaderServiceContract>(new InstanceContext(this), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), new EndpointAddress(address));
        server_manager = factory.CreateChannel();
        logger.Info("Client Connected");

        logger.Info(string.Format(server_manager.Ping(this.this_service_id, new byte[1]  0012 )));
        logger.Info(string.Format(server_manager.SetLastRequstTime(this.this_service_id, DateTime.Now)));

    

服务器代码:

string address = "net.pipe://localhost/servermanager/";

serviceHost = new ServiceHost(service_manager);
NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
serviceHost.AddServiceEndpoint(typeof(IDownloaderServiceContract), binding, address);
serviceHost.Open();

Console.WriteLine("ServiceHost running. Press Return to Exit");

IDownloaderService合同代码:

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IDownloaderCallbackService))]

public interface IDownloaderServiceContract

    [OperationContract]
    string Ping(uint service_id, byte[] p);
    [OperationContract]
    string Pong(uint service_id, byte[] p);

    [OperationContract]
    dynamic SetLastRequstTime(uint service_id, dynamic data);

【问题讨论】:

【参考方案1】:

我通过在连接代码块中将 ConcurrencyMode 设置为 True 解决了这个问题。

    string address = "net.pipe://localhost/servermanager/";
    var factory = new DuplexChannelFactory<IDownloaderServiceContract>(new InstanceContext(this), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), new EndpointAddress(address));
    ((CallbackBehaviorAttribute)factory.Endpoint.EndpointBehaviors[typeof(CallbackBehaviorAttribute)]).ConcurrencyMode = ConcurrencyMode.Multiple;
    server_manager = factory.CreateChannel();

【讨论】:

以上是关于如何在c#中继承非继承属性的主要内容,如果未能解决你的问题,请参考以下文章

C#中继承问题

C#中继承对象的内存分配

为啥我不能在 C# 中继承一个类? [复制]

和你碰到同样问题C#继承窗口不能修改控件属性

私有成员是不是在 C# 中继承?

[Visual Studio]项目属性中继承的值怎么删除