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
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
au lieu de 'object objSqlType;' utiliser 'yourInterface objSqlType;'. Peut-être envisager d'utiliser la classe de base au lieu de l'interface – Ondra
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