【问题标题】:How to modify the contents of a method in .NET如何在 .NET 中修改方法的内容
【发布时间】:2023-03-22 09:01:01
【问题描述】:

我想知道是否有一种方法可以“隐藏”一个函数,以下类在我当前项目的程序集引用中,我无法以任何方式修改程序集的内容。

Public Class  CoordinateSpace

Public Function FromPixelsY(ByVal y As Single) As Single
    Return (Me.m_originY + ((y * Me.ZoomY) / (Me.m_dpiY / 100.0F)))
End Function

Public Function ToPixelsY(ByVal y As Single) As Single
    Dim num2 As Single = ((y - Me.m_originY) / Me.ZoomY) * (Me.m_dpiY / 100.0F)
    Me.CheckOverflow(num2)
    Return num2
End Function  
End Class

此外,在程序集中,我在许多类中有许多调用,如下所示:

Public Class Printer
      public function testPx() as  boolean
       dim c as new CoordinateSpace
       return c.ToPixelsY(18) > 500
      end function
    End Class

对于我的项目,当调用 ToPixelsY 时,我需要上述类返回 FromPixelsY 中的内容。

有没有办法做到这一点?如果我继承类并覆盖或隐藏这些方法,那么当 testPx 调用函数 ToPixelsY 时,它实际上会调用 CoordinateSpace 方法,而不是我的新类的方法。

这是在 VB.net 中,但任何用于解决方案的 .NET 语言都可以。 希望这很清楚,谢谢!

【问题讨论】:

  • 从类型继承并覆盖属性。
  • ToPixelsY 已经返回了一个值。你的意思是你想摆脱 ToPixelsY 的 3 行实现,本质上用 Return Me.FromPixelsY(y) 替换它?
  • 是的@ChrisSinclair,这正是我想要达到的。程序集中的许多类都调用此ToPixelsY 函数,但返回类型不是我所期望的,相反,FromPixelsY 返回类型是我正在寻找的。​​span>
  • 如果你不能改变程序集的源代码,没有IL编织,我认为你不能。你最好的办法是用你自己的实现外观包装CoordinateSpace(以及使用它的相关类)。从它的外观来看,我猜这个类的设计并没有考虑到可扩展性(也就是说,这些方法是不可覆盖的),所以我不确定如何重新设计你的应用程序使用的含义解决这个问题。
  • @ChrisSinclair - 如果该类未密封(VB.NET 中的NotInheritable),那么您可以从CoordinateSpace 派生一个新类,然后覆盖(VB.NET 中的Overrides , new in C#) 方法并让它调用基类的方法。

标签: c# .net vb.net reflection shadows


【解决方案1】:
Public Class  MyCoorSpace 
 inherits CoordinateSpace



Public Overrides Function ToPixelsY(ByVal y As Single) As Single
    Return MyBase.FromPixelsY(y)
End Function  

End Class

那是继承

现在,case 类的装饰是密封的(VB.NET 中的NotInheritable

Public Class  MyCoordSpace // here of course would be nice to implement same interface as CoordinateSpace, if any 

    private  _cs as new CoordinateSpace()

Public Function ToPixelsY(ByVal y As Single) As Single
    Return _cs.FromPixelsY(y)
End Function  

End Class

【讨论】:

  • 好的,这是一个不错的方法,但是我需要保证当程序集中的任何类调用基类 CoordinateSpace 时,会调用 MyCoordSpace 函数 ToPixelsY;你觉得有可能吗?
  • 当然,这是不可能的。您无法控制在引用程序集中调用的内容。但是您可以控制从程序集中调用的内容。您需要抽象调用的实现。您的客户必须通过基类或接口调用对象,并且您必须提供您希望他们调用的对象。所以,他们不会调用对象CoordinateSpace,而是调用你给他们的对象,但地下工作将由CoordinateSpace完成。
猜你喜欢
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多