2009-02-27 9 views
1

Je suis un débutant vb.net, alors s'il vous plaît, supportez-moi. Est-il possible de créer des propriétés (ou attributs) pour une classe dans Visual basic (j'utilise Visual Basic 2005)? Toutes les recherches sur le Web pour la métaprogrammation ne m'ont conduit nulle part. Voici un exemple pour clarifier ce que je veux dire.Propriétés dynamiques pour les classes en Visual Basic

public class GenericProps 
    public sub new() 
     ' ??? 
    end sub 

    public sub addProp(byval propname as string) 
     ' ??? 
    end sub 
end class 

sub main() 
    dim gp as GenericProps = New GenericProps() 
    gp.addProp("foo") 
    gp.foo = "Bar" ' we can assume the type of the property as string for now 
    console.writeln("New property = " & gp.foo) 
end sub 

Est-il possible de définir la fonction addProp?

Merci! Amit

Répondre

0

Non - ce n'est pas possible. Vous auriez besoin d'un Ruby comme "method_missing" pour gérer l'appel .Foo inconnu. Je crois que C# 4 promet d'offrir quelque chose dans ce sens.

3

Il n'est pas possible de modifier une classe à l'exécution avec de nouvelles propriétés . VB.Net est un langage statique dans le sens où il ne peut pas modifier ses classes définies lors de l'exécution. Vous pouvez simuler ce que vous cherchez avec un sac de propriété.

Class Foo 
    Private _map as New Dictionary(Of String, Object) 
    Public Sub AddProperty(name as String, value as Object) 
    _map(name) = value 
    End Sub 
    Public Function GetProperty(name as String) as Object 
    return _map(name) 
    End Function 
End Class 

Il ne permet pas d'accès direct sous forme de myFoo.Bar mais vous pouvez appeler myFoo.GetProperty ("Bar"). Je pense que c'est possible avec les API de profilage, mais ce n'est probablement pas ce que vous cherchez.

+0

Sérialisation qui pourrait être amusant . –

+0

@Angry Jim, l'objet à tout moment est impliqué, la sérialisation est une proposition risquée. – JaredPar

+0

@JaredPar - C'est bon et pourrait travailler pour moi. BTW Je n'ai pas une exigence stricte pour utiliser la classe existante. Je suis d'accord pour créer la classe dynamiquement. J'ai regardé System.Reflection.Emit hier et c'était l'ouverture des yeux! --Amit – Amit