2016-05-12 1 views
0

J'ai une application C# de base pour traiter certains fichiers sql. J'ai une classe pour chaque type d'objet comme proc, fonction, vue, etcComment puis-je avoir un objet qui peut être n'importe quelle classe avec les mêmes méthodes?

Ce que je veux faire dans le principal est de déterminer quel type de fichier de script dans le traitement et les créer une instance de cette classe.

Ensuite, en utilisant cet objet, appelez-le objSqlType, je veux appeler une méthode dans la classe sous-jacente. chaque classe aura les mêmes noms de méthodes implémentés comme getHeader(), getPermissions(), etc

Est-ce possible? Je regardais les interfaces qui me oblige à créer des méthodes, mais ne peut pas sembler utiliser un seul objet,

par exemple:

object objSqlType; 

switch (type) 
{ 
    case ObjectType.PROC: 
     objSqlType = new SqlProc(); 
     break; 
    case ObjectType.FUNCTION: 
     objSqlType = new SqlFunction(); 
     break; 
    case ObjectType.VIEW: 
     objSqlType = new SqlView(); 
     break; 
    default: 
     break; 
} 

string header = objSqlType.getHeader(); // call getHeader for whichever object I created 
+1

Possible copie de [Comment utiliser la réflexion pour appeler la méthamphétamine od by name] (http://stackoverflow.com/questions/3110280/how-to-use-reflection-to-call-method-by-name), cela devrait être fait si vous connaissez le nom de la méthode et que tous les types l'ont (vous pouvez vérifier si la méthode existe autrement). Du point de vue de la conception, vous devez utiliser des interfaces (ou même une classe de base si les objets sont similaires). – Sinatr

+3

au lieu de 'object objSqlType;' utiliser 'yourInterface objSqlType;'. Peut-être envisager d'utiliser la classe de base au lieu de l'interface – Ondra

+0

Je créerais un objet générique MainObject où T peut être l'une des classes que vous désirez func, proc, view. Ces classes implémenteraient toutes la même interface IMyInterface.'class MainObject où T: IMyInterface {public T myObject {get; set;} ...}'. – CFreitas

Répondre

4
  1. Créer une interface
  2. créer des classes qui mettent en œuvre cette interface
  3. Déclarez votre objet comme cette interface
  4. instancier objet comme l'une des classes qui mettent en œuvre l'interface

Vous aimez cette :

public interface ISqlType 
{ 
    string getHeader(); 
} 

public class SqlProc : ISqlType 
{ 
    public string getHeader() 
    { 
     return "I'm a SqlProc!" 
    } 
} 

public class SqlFunction : ISqlType 
{ 
    public string getHeader() 
    { 
     return "I'm a SqlFunction!" 
    } 
} 

public class SqlView : ISqlType 
{ 
    public string getHeader() 
    { 
     return "I'm a SqlView!" 
    } 
} 

ISqlType objSqlType; 

switch (type) 
{ 
    case ObjectType.PROC: 
     objSqlType = new SqlProc(); 
     break; 
    case ObjectType.FUNCTION: 
     objSqlType = new SqlFunction(); 
     break; 
    case ObjectType.VIEW: 
     objSqlType = new SqlView(); 
     break; 
    default: 
     break; 
} 

string header = objSqlType.getHeader(); 
+0

Merci! c'est exactement ce que j'étais après. Je n'ai simplement pas défini mon type générique comme interface! Merci. – user3781891

0

utilisation dynamic

dynamic objSqlType; 

// rest of code 

string header = objSqlType.getHeader(); 

il semble également que vous êtes en utilisant une variable non initialisée ici parce que si vous tombez dans default cas alors objSqlType n'est pas initialisé et vous ne pouvez pas utiliser une variable locale non initialisée.

+0

Et je cite: _Par conséquent, aucune erreur de compilation n'est signalée. Cependant, l'erreur n'échappe pas à l'avis indéfiniment. Il est intercepté à l'exécution et provoque une exception d'exécution. De: https://msdn.microsoft.com/en-us/library/dd264736.aspx Pourquoi voudriez-vous cela dans votre code? –

0

Créez une interface et faites en sorte que chaque objet l'implémente. Ou bien, créez une classe abstraite et faites en sorte que chaque objet en hérite.

0

Peut être ci-dessous le code vous aider. Je ne suis pas sûr si vous voulez supprimer créer un nouvel objet du client et le rendre centralisé.

Vous pouvez penser à faire vos besoins de manière découplée Comme ..

interface IDBObject 
{ 
    string GetDBType() 
} 

then have your required classes and implement respect interface 

public class SQLStoreProc:IDBObject 
{ 
    public string GetDBType() 
    {} 
} 

public class SQLFunction:IDBObject 
{ 
public string GetDBType() 
    {} 
} 

public class SQLMisc:IDBObject 
{ 
public string GetDBType() 
    {} 
} 

Maintenant, créez votre emballage ou une catégorie d'usine qui sera

class clsFactory 
{ 
    public static IDBObject CreateObject(string type) 
    { 
     IDBObject ObjSelector = null; 

     switch (type) 
     { 
      case "SP": 
       ObjSelector = new SQLStoreProc(); 
       break; 
      case "FUNC": 
       ObjSelector = new SQLFucntion(); 
       break; 
      default: 
       ObjSelector = new SQLMisc(); 
       break; 
     } 
     return ObjSelector; 
    } 
} 

maintenant dans la méthode principale, vous pouvez avoir quelque chose comme ci-dessous

public static void main (args a) 
{ 
    IDBObject ObjIntrface = null; 
    ObjIntrface = clsFactory.CreateObject(your object type); 
    string res = ObjIntrface.GetDBType("First", "Second"); 

}