ParameterInfo.ParameterType.IsByRef возвращает true, если объявление параметра выполняется с ключевым словом ByRef, и возвращает false, если объявление с ключевым словом ByVal (независимо от того, является ли тип параметра побочным (например, структура) ) или по ссылке (например, класс)).
Для иллюстрации рассмотрим следующую структуру и класс (я использую код VB):
' Empty structure and class, just for illustration.
Public Structure MyStruct
End Structure
Public Class MyClass1
End Class
И предположим, у вас есть следующий метод, который принимает аргументы ByVal и ByRef для структуры и класса, определенных выше (обратите внимание, что начиная с VB 2012, вы можете опустить ключевое слово ByVal, поскольку оно используется по умолчанию):
Public Sub P(s1 As MyStruct, ByRef s2 As MyStruct, c1 As MyClass1, ByRef c2 As MyClass1)
End Sub
Теперь следующий код тестирует метод ParameterInfo.ParameterType.IsByRef:
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
' Reflect on method P:
Dim mi As MethodInfo = Me.GetType.GetMethod("P")
' Iterate all parameters, and call its ParameterType.IsByRef method:
For Each pi As ParameterInfo In mi.GetParameters
If **pi.ParameterType.IsByRef** _
Then Console.WriteLine(pi.Name & " is ByRef") _
Else Console.WriteLine(pi.Name & " is ByVal")
Next
End Sub
Вы получите следующий вывод:
s1 is ByVal
s2 is ByRef
c1 is ByVal
c2 is ByRef
Как видите, ParameterInfo.ParameterType.IsByRef возвращает true для аргументов s2 и c2, поскольку они определены с помощью ключевого слова ByRef, даже если один из них является структурой (тип-значения), а другой - классом (ссылка -тип); и возвращает false для аргументов, определенных с помощью ключевого слова ByVal.
Обратите внимание, однако, что ключевое слово ByVal не означает, что все аргументы будут переданы как копия. Даже если используется это ключевое слово (ByVal), если тип является побочной ссылкой (например, класс), аргумент будет передан по ссылке, как если бы использовалось ключевое слово ByRef. Таким образом, c1 и c2 описанного выше метода P будут оба передаваться по ссылке, что означает, что если P изменяет поле или свойство на c1 или c2, изменения будут отражены вызывающей стороне. (ByVal и ByRef имеют значение, главным образом, когда тип является значением, например структурой.)