2017-10-20 60 views
-2

On suppose qu'il ya une classe de baseC# Peut-on passer le type de classe en tant que paramètre à la fonction et les variables de classe d'accès à l'intérieur de la méthode

class base 
{ 
    int x, y; 
} 

Et 3 dérivé singleton classes A, B, C avec x, y initialisés à certains valeur.

exemple:

class A : base { x = 1; y = 0;} 
class B : base { x = 0; y = 1;}  
class C : base { x = 1; y = 1;} 

est-il un moyen de passer de classe en tant que paramètre à la méthode et l'accès valeur de la variable de cette classe. SO, Une fonction qui peut mettre à jour les valeurs pour les 3 classes.

Intention:

int call (type classtype) 
{ 
    int xvalue = classtype.x; 
    int yvalue = classtype.y; 
} 

Je l'ai vu dans certains postes une mention Activator.CreateInstance (classtype) dans How to pass a Class as parameter for a method? [duplicate]

Mais il ne répond pas à la façon dont nous pouvons accéder à des variables de cette classe .

+0

Il devrait être 'appel int (base ClassType)' et vous passeriez l'objet instancié. – Legends

+4

Le * type * ne possède pas ces variables. * Les instances * de ce type ont ces variables, donc avoir le * type * ne vous donne aucune variable. – Servy

+0

S'il vous plaît afficher le code pour "classes A, B" - très peu clair ce que vous voulez dire "valeur variable de la classe" comme @Servy a dit. Vous pouvez faire référence à des champs de classe statiques/propertied * ou * des champs/propriétés d'instance - serait clair si le code est réellement C# et non pas un pseudo-langage. –

Répondre

0

Votre méthode doit accepter le Type et vous pouvez accéder aux propriétés statiques car vous n'avez pas l'instance.

int Call(Type classType) 
{ 
    var xvalue = (int)classType.GetProperty("x", BindingFlags.Public | BindingFlags.Static).GetValue(null, null); 
    var yvalue = (int)classType.GetProperty("y", BindingFlags.Public | BindingFlags.Static).GetValue(null, null); 
} 

Bien que je sente que ce que vous cherchez vraiment est juste un héritage simple ou une interface en tant que paramètre.

+0

Et comment appelez-vous cette méthode? – Steve

+0

@Steve 'Appel (typeof (MyType))' –

+0

Et ce résultat (pour moi) dans un null retourné par GetProperty avec le NRE juste derrière – Steve

-1

Vous pouvez changer Call d'accepter la classe de base A, B, C dérive de:

int Call(base theClass) 
{ 
    if (theClass is A) 
    { 
     var ax = theClass.x; 
     var ay = theClass.y; 
    } 
    else if (theClass is B) 
    { 
     // etc  
    } 
    // etc 
} 
+2

Habituellement, lorsque vous vous trouvez en train de faire cela, c'est un signe d'odeur de code.Au lieu d'avoir un tas de vérifications 'is' vous faites juste deux surcharges' Call (A theClass) 'et' Call (B theClass) ' –

+1

La chose est la fonctionnalité est la même pour A, B et C et il n'est pas efficace de définir différents fonctions/processus pour chaque classe, Au lieu de cela, nous devrions être en mesure d'envoyer un para et en fonction de cette instance create/access de la classe respective. –