2010-11-09 3 views
2

Если я передаю Label1.Text через функцию, он обрабатывает его как объект, а не строку. И это хорошо.Ссылка Label1.Text as Object

Но когда я делаю что-то вроде:

Dim temp As Object = Label1.Text 

А затем передать его через функцию она рассматривает его как строку, которая следует ожидать. Как я могу это сделать, поэтому я могу установить Label1.Text для объекта так же, как если бы я просто передал его через функцию.

Edit: Вот именно то, что я хочу сделать

Public Sub test() 
    setIt(Label1.Text, "Test") 'this works 

    Dim temp As Object = Label1.Text 
    setIt(temp, "Test") 'this doesnt work 
End Sub 
Public Sub setIt(ByRef e, ByVal v) 
    e = v 
End Sub 
+0

Из внешнего вида вы пытаетесь создать ссылку на текстовое свойство в ярлыке, чтобы вы могли установить его с помощью этого метода 'setIt' –

+0

да, но мне нужно, чтобы он был открыт для любого свойства не только текста. – Phil

+0

Проверьте мое редактирование для новой функции, которую я адаптировал из некоторого кода отражения. –

ответ

4

Строка представляет собой строку, независимо от вас понижающее приведение его в объект или нет. Вы можете проверить это с помощью typeof temp is String (typeof-keyword).

Я не понимаю, где ваша фактическая проблема.

Вы не можете установить свойство Text Label с заданным объектом, потому что Label.Text должен быть типа String. Но вы могли бы использовать объекта ToString, чтобы получить строку ПРЕДСТАВЛЕНИЯ вашего объекта или, если вы знаете (проверить с TYPEOF), что ваш объект имеет тип String, вы можете просто бросить его обратно:

Label1.Text = DirectCast(temp , String) 

EDIT: По к вашим обновлениям, я сильно recommend установить Option Strict! Почему вы не просто присваиваете значение свойству Text?

Label1.Text = "Test" 

Вы приближаетесь к методу ByRef и не очень читаемы. Если вам действительно нужна такая вещь, и вы хотите установить только Text свойства различных элементов управления, попробуйте следующее:

Public Sub setControlText(ByVal ctrl As Control, ByVal text String) 
    ctrl.Text = text 
End Sub 

или если ваш «текст» должен иметь тип объекта:

Public Sub setControlText(ByVal ctrl As Control, ByVal value As Object) 
     If Not value Is Nothing Then ctrl.Text = value.ToString 
End Sub 

или вы можете использовать отражение, чтобы установить все свойства, но это не должно быть стандартным

Public Sub setProperty(ByVal obj As Object, ByVal propName As String, ByVal newValue As Object) 
    Dim prop As Reflection.PropertyInfo = obj.GetType().GetProperty(propName) 
    If Not prop Is Nothing AndAlso prop.CanWrite Then 
     prop.SetValue(obj, newValue, Nothing) 
    End If 
End Sub 

вы можете вызвать эту функцию следующим образом (считаю, что имя-свойства случая сено sitive):

setProperty(Label1, "Text", "Hello World!") 
+0

Я бы порекомендовал подход Тима, если вы только устанавливаете текст и используете только мой подход, если у вас должна быть гибкость для установки любого свойства в объекте или элементе управления. –

+0

Этот последний раздел, по сути, я только что написал: | –

+0

Да, я видел позже. Но я думаю, что мы направляем его в неправильном направлении. Я уверен, что подход к размышлению накладные в его ситуации. –

1

Хотя вы можете конвертировать и завернуть с помощью этого:

Dim objTemp As Object = CObj(Label1.Text) 

или

Dim objTemp As Object = CType(Label1.Text, Object) 

Затем, когда вам это нужно позже, просто разворачивать его, используя противоположный

Dim strTemp As String = CType(objTemp, String) 

Редактировать:

Если вы используете эту функцию wee и вызываете ее, используя объявление строки свойства, вы можете динамически редактировать свойства объектов.

Public Shared Sub SetPropertyValue(ByVal o As Object, _ 
        ByVal propertyName As String, ByVal newValue As Object) 
     Dim pi As Reflection.PropertyInfo 
     pi = o.[GetType]().GetProperty(propertyName) 
     If pi Is Nothing Then 
      Throw New Exception("No Property [" & propertyName & "] in Object [" & o.[GetType]().ToString() & "]") 
     End If 
     If Not pi.CanWrite Then 
      Throw New Exception("Property [" & propertyName & "] in Object [" & o.[GetType]().ToString() & "] does not allow writes") 
     End If 
     pi.SetValue(o, newValue, Nothing) 
    End Sub 

Вызов:

SetPropertyValue(objTemp, "Phone", newVal) 

или в случае с Label1:

Dim newVal as String = "Test" 
SetPropertyValue(Label1, "Text", newVal) 

Надежда, что помогает.

+0

Вы поменяли место в CType –

+0

Спасибо Тим! Я буду обвинять его в нехватке утреннего кофе. –

+0

Спасибо, ребята, ваши сообщения решили мою проблему. – Phil