Метод FromLTRB
, который вы цитируете, является Shared
, то есть он является членом типа Rectangle
, но не экземпляра Rectangle
.Обратите внимание, что вы вызываете его на Rectangle
, но не на A Rectangle
.
Методы расширения можно использовать только так, как если бы они были членами экземпляра.Вы не можете написать метод расширения, который вы вызываете для типа Rectangle
, но только для того, что вы вызываете для экземпляра Rectangle
.Экземпляр, который вы вызываете, фактически представлен первым параметром.Ваш метод расширения должен выглядеть следующим образом:
Imports System.Runtime.CompilerServices
Public Module RectangleExtensions
<Extension>
Public Function FromPoints(source As Rectangle, points As List(Of Point)) As Rectangle
'...
End Function
End Module
, и тогда вам придется называть его так:
Dim rect As Rectangle
Dim points As New List(Of Point)
'...
Dim newRect = rect.FromPoints(points)
Это не совсем идеально, потому что вы должны иметь Rectangle
для начала, но никак не обойти это, потому что метод расширения требует вызова экземпляра расширяемого типа.
Кстати, я бы хотел написать этот метод так:
Imports System.Runtime.CompilerServices
Public Module RectangleExtensions
<Extension>
Public Function FromPoints(source As Rectangle, points As IEnumerable(Of Point)) As Rectangle
Dim pointArray = points.ToArray()
Dim allX = pointArray.Select(Function(p) p.X).ToArray()
Dim allY = pointArray.Select(Function(p) p.Y).ToArray()
Return Rectangle.FromLTRB(allX.Min(),
allY.Min(),
allX.Max(),
allY.Max())
End Function
End Module
Использование IEnumerable(Of Point)
делает метод более гибким, а использование LINQ делает его более лаконичным.LINQ на самом деле ухудшает производительность, но вам понадобится значительно больший список Points
, чтобы иметь какое-либо заметное отличие.
РЕДАКТИРОВАТЬ:
Я должен четко указать, чтоТот факт, что для метода расширения требуется экземпляр, а для этого сценария не требуется экземпляр до вызова метода, означает, что в этом случае не следует использовать метод расширения.Просто напишите метод, который принимает список Points
, возвращает Rectangle
и помещает его в нужное место:
Public Function RectangleFromPoints(points As IEnumerable(Of Point)) As Rectangle
Dim pointArray = points.ToArray()
Dim allX = pointArray.Select(Function(p) p.X).ToArray()
Dim allY = pointArray.Select(Function(p) p.Y).ToArray()
Return Rectangle.FromLTRB(allX.Min(),
allY.Min(),
allX.Max(),
allY.Max())
End Function