.net 如何使用泛型方法替换重复的属性?

.net 如何使用泛型方法替换重复的属性?,.net,vb.net,generics,.net,Vb.net,Generics,当前我的代码具有以下属性: Private _queueRetriever As Services.IQueueRetriever Public ReadOnly Property QueueRetriever As Services.IQueueRetriever Get If _queueRetriever Is Nothing Then RemotingSetup.RegisterHttpBinaryChannel()

当前我的代码具有以下属性:

  Private _queueRetriever As Services.IQueueRetriever
  Public ReadOnly Property QueueRetriever As Services.IQueueRetriever
     Get
        If _queueRetriever Is Nothing Then
           RemotingSetup.RegisterHttpBinaryChannel()
           _queueRetriever = RemotingFactory.CreateProxy(Of Services.IQueueRetriever)(Options.DevLocal)
        End If

        Return _queueRetriever
     End Get
  End Property

  Private _queueCountRetriever As Services.IQueueCounter
  Public ReadOnly Property QueueCounter As Services.IQueueCounter
     Get
        If _queueCountRetriever Is Nothing Then
           RemotingSetup.RegisterHttpBinaryChannel()
           _queueCountRetriever = RemotingFactory.CreateProxy(Of Services.IQueueCounter)(Options.DevLocal)
        End If

        Return _queueCountRetriever
     End Get
  End Property
如您所见,这两个属性的代码本质上是相同的。只是类型不同。我对泛型方法不是很有经验,但我觉得我应该能够更多地使用泛型来编写代码。这是可以做到的,还是不是泛型方法的工作

编辑

基于Marc的回答,我得出以下结论:

  Protected Services As New Dictionary(Of Type, Object)

  Protected Function CreateService(Of T)() As T
     If Not Services.ContainsKey(GetType(T)) Then

        RemotingSetup.RegisterHttpBinaryChannel()
        Services.Add(GetType(T), RemotingFactory.CreateProxy(Of T)(Options.DevLocal))

     End If

     Return DirectCast(Services(GetType(T)), T)
  End Function
当然,可以这样使用:

Me.CreateService(Of IService).Foo()
你可以这样做(很抱歉换成C#,但我的VB技能缺乏这里的微妙之处——我相信它在VB中也能很好地工作)


您可以创建一个私有泛型方法来返回相应的通道,但在这种情况下,您基本上可以用一行代码替换两行代码,并使用两行方法调用。这可能不值得付出努力,除非您添加第三种类型的频道,否则在第三种情况下,您可能会忘记
远程设置.RegisterHttpBinaryChannel
行。

您无法在.Net中创建通用属性

您可以做的是创建一个要在Get中调用的通用方法:

  Private _queueCountRetriever As Services.IQueueCounter
  Public ReadOnly Property QueueCounter As Services.IQueueCounter
     Get
        Return MyGet(Of QueueCounter ,IQueueCounter )(_queueCountRetriever)
     End Get
  End Property

  Private Function MyGet(Of T As IT, IT)(ByRef propertyVar As T ) As IT
       If propertyVar Is Nothing Then
           RemotingSetup.RegisterHttpBinaryChannel()
           propertyVar = RemotingFactory.CreateProxy(Of IT)(Options.DevLocal)
        End If
  End Function

他有240k+rep是有原因的。我考虑了helper方法,没有考虑使用ref关键字来覆盖方法中字段的初始化。如果可以的话,我会投5票。面对这一切,我的建议显得微不足道。酷!难道不可能用一个可能维护实例化服务字典的方法完全替换属性吗?@TaylorOtwell,如果你愿意,probably@Marc格雷威尔-谢谢!你们的例子让我非常接近,我能够编写一个维护服务字典的方法。
private Services.IQueueCounter queueCounter;
public Services.IQueueCounter QueueCounter {
    get { return GetProxy(ref queueCounter); }
}
private Services.IQueueRetriever queueRetriever;
public Services.IQueueRetriever QueueRetriever {
    get { return GetProxy(ref queueRetriever); }
}
  Private _queueCountRetriever As Services.IQueueCounter
  Public ReadOnly Property QueueCounter As Services.IQueueCounter
     Get
        Return MyGet(Of QueueCounter ,IQueueCounter )(_queueCountRetriever)
     End Get
  End Property

  Private Function MyGet(Of T As IT, IT)(ByRef propertyVar As T ) As IT
       If propertyVar Is Nothing Then
           RemotingSetup.RegisterHttpBinaryChannel()
           propertyVar = RemotingFactory.CreateProxy(Of IT)(Options.DevLocal)
        End If
  End Function