Сокрытие публичных функций - PullRequest
0 голосов
/ 18 ноября 2009

Это довольно общий вопрос, потому что мне просто интересно, какие потенциальные варианты есть для этого.

Скажем, у меня есть простой класс:

    Public Class Example

    Private _One As String

    Public Property One() As String
        Get
            Return _One
        End Get
        Set(ByVal value As String)
            _One = value
        End Set
    End Property

    Public Function DoSomething() As Integer

    End Function
End Class

РЕДАКТИРОВАТЬ: приведенный выше класс является лишь примером того, что может быть возвращено из веб-службы. У меня не будет доступа, чтобы изменить его вообще, извините, если я не прояснил это.

Можно ли как-то сделать клон этого класса, чтобы он сохранял все значения свойств, но скрывал факт наличия функции Public?

Я хотел бы иметь возможность взять некоторые существующие классы, которые мы извлекаем из веб-службы (которые мы не писали), и иметь возможность передавать их для использования в приложении, но без раскрытия функций. Я не хочу идти по пути создания своих собственных классов, которые конкретно определяют каждое свойство и записывают значения (из-за огромного размера некоторых из них), поэтому я смотрю, есть ли что-нибудь динамическое, можно использовать (может быть, есть способ с помощью отражения?).

Любые идеи будут с благодарностью.

Спасибо, Mark

Ответы [ 4 ]

1 голос
/ 18 ноября 2009

Похоже, в следующей статье описаны некоторые приемы, которые могут оказаться полезными. http://coding -passion.blogspot.com / 2008/12 / добавлений-свойства-объект-dynamically.html

Автор динамически добавляет свойства к объекту, что по сути и является тем, что вы хотите сделать. Единственная «проблема», с которой вы столкнетесь, заключается в том, что из-за того, что свойства являются динамическими, вам нужно использовать отражение, чтобы получить и установить их (ваше приложение не будет знать о свойствах до тех пор, пока оно не запустится - не сможет непосредственно ссылаться на них во время разработки). Ниже приведены некоторые примеры методов для этого.

Кроме того, я не знаю, как "скрыть" публичные методы при наследовании от класса.


Public Function SetProperty(ByVal obj As Object, ByVal PropertyName As String, ByVal val As Object) As Boolean
    Dim property_value As Object
    Dim properties_info As System.Reflection.PropertyInfo() = obj.GetType.GetProperties
    Dim property_info As System.Reflection.PropertyInfo

    For Each prop As System.Reflection.PropertyInfo In properties_info
        If prop.Name = PropertyName Then property_info = prop
    Next

    If property_info IsNot Nothing Then
        Try
            property_info.SetValue(obj, val, Nothing)
            Return True
        Catch ex As Exception
            Return False
        End Try
    Else
        Return False
    End If
End Function

Public Function GetProperty(ByVal obj As Object, ByVal PropertyName As String) As Object
    Dim property_value As Object
    Dim properties_info As System.Reflection.PropertyInfo() = obj.GetType.GetProperties
    Dim property_info As System.Reflection.PropertyInfo

    For Each prop As System.Reflection.PropertyInfo In properties_info
        If prop.Name = PropertyName Then property_info = prop
    Next

    If property_info IsNot Nothing Then
        Try
            property_value = property_info.GetValue(obj, Nothing)
            Return property_value
        Catch ex As Exception
            Return Nothing
        End Try
    Else
        Return Nothing
    End If
End Function

http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.setvalue.aspx http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.getvalue.aspx

0 голосов
/ 19 ноября 2009

Этот класс является универсальным объектом, который извлекает Properties из объекта, который передается в конструктор PropertyBag. Значения свойств затем могут быть получены через общие свойства Type по имени свойства.

Imports System
Imports System.Collections.Generic

Public Class PropertyBag

    Private _Ints As Dictionary(Of String, Integer)
    Private _Strings As Dictionary(Of String, String)

    Sub New(ByVal obj As Object)

        Dim name As String
        Dim value As Object
        Dim prop As Reflection.PropertyInfo

        _Ints = New Dictionary(Of String, Integer)
        _Strings = New Dictionary(Of String, String)

        For Each prop In obj.GetType.GetProperties
            name = prop.Name.ToUpper
            value = prop.GetValue(obj, Nothing)

            Select Case prop.PropertyType.Name
                Case "Int32"
                    _Ints.Add(name, CType(value, Integer))
                Case "String"
                    _Strings.Add(name, value.ToString)
            End Select
        Next

    End Sub

    Public Function [Integer](ByVal sKey As String) As Integer
        Return _Ints(sKey.ToUpper)
    End Function
    Public Function [String](ByVal sKey As String) As String
        Return _Strings(sKey.ToUpper)
    End Function

End Class

Пример использования будет ...

Public Class Example

    Private _one As String
    Private _two As Integer

    Public Property One() As String
        Get
            Return _one
        End Get
        Set(ByVal value As String)
            _one = value
        End Set
    End Property
    Public Property Two() As Integer
        Get
            Return _two
        End Get
        Set(ByVal value As Integer)
            _two = value
        End Set
    End Property

    Public Function DoSomething() As Integer
        Return 666
    End Function

End Class

Sub Main()

    Dim s As String
    Dim i As Integer
    Dim ex As New Example

    ex.One = "ONE"
    ex.Two = 2

    Dim o As New PropertyBag(ex)

    s = o.String("One")
    i = o.Integer("Two")

    Stop

End Sub
0 голосов
/ 18 ноября 2009

Если вы не можете изменить веб-сервис (если можете, вы можете удалить [WebMethod] из функции DoSomething), возможно, вы могли бы создать производный класс из прокси веб-сервиса на стороне клиента и скрыть метод с помощью public new integer DoSomething() {}

(Извините, я не знаю синтаксис VB.net)

Если вы хотите, чтобы это работало для любого объекта, вы можете использовать какой-то фасад, полностью скрывая ваш объект. Фасад имеет общедоступную собственность public Object obj { get; set; } и две функции ReadMember и SetMember. Эти две функции получают и устанавливают атрибуты объекта с помощью отражения.

0 голосов
/ 18 ноября 2009

Если вы просто хотите представить метод в своей библиотеке (и скрыть его от своего приложения), я думаю, вам нужно ключевое слово Friend вместо ключевого слова Public в вашем методе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...