如何在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#中继承非继承属性的主要内容,如果未能解决你的问题,请参考以下文章