2010-04-27 5 views
3

Donc, j'ai essayé de faire des recherches tout au long de la matinée, et je n'ai pas eu de chance. J'essaye de trouver un moyen de créer dynamiquement une méthode/delegate/lambda qui retourne une nouvelle instance d'une certaine classe (inconnue jusqu'à l'exécution) qui hérite d'une certaine classe de base.Création de méthodes dynamiques

Je peux vous garantir ce qui suit au sujet de la classe inconnue/dynamique

  1. Il sera toujours hériter d'une classe connue (rangée)
  2. Il aura au moins 2 constructeurs (un en acceptant une longue et une acceptation un IDataRecord)

Je prévois sur les éléments suivants Faire des:

  1. Trouver tous les c lasses qui ont un attribut sur les
  2. Création d'un délégué/méthode/lambda/whatever qui crée une nouvelle instance de la classe
  3. Stockage du délégué/whatever ainsi que quelques propriétés dans une struct/classe
  4. Insérez la struct dans une table de hachage
  5. En cas de besoin, retirer l'information de la table de hachage et appeler le délégué/quoi pour obtenir une nouvelle instance de la classe et la renvoyer/l'ajouter à une liste/etc.

Je n'ai besoin d'aide qu'aveC# 2 ci-dessus !!! Je n'ai aucune idée par où commencer. J'ai juste besoin de matériel de référence pour me lancer, ou de quelques mots-clés à mettre dans google.

Ceci est pour un ORM compact/simple à utiliser pour notre bureau ici. Je comprends que ce qui précède n'est pas simple, mais une fois qu'il fonctionne, il devrait rendre le code incroyablement simple.

S'il vous plaît laissez-moi savoir si vous avez besoin de plus d'informations! Et merci d'avance! :)

Répondre

4

Vous pouvez utiliser LINQ expressions pour construire le lambda (long p) => new XXX(p) as Row à l'exécution: Je crois que

Type type = // ... 
ConstructorInfo ctor = type.GetConstructor(new Type[] { typeof(long) }); 

var p = Expression.Parameter(typeof(long), "p"); 
var expr = Expression.Lambda<Func<long, Row>>(
       Expression.TypeAs(
        Expression.New(ctor, p), 
        typeof(Row)), 
       p); 

Func<long, Row> rowCreator = expr.Compile(); 

Row row = rowCreator(10); 
+1

Jamais vraiment vu un bon usage des expressions, mais vous avez ouvert les yeux un peu :) – Stormenet

+0

j'aime le style, mais il compile à vrai IL et est la performance aussi bien que de new long(); – Andrey

+0

@Andrey: 'expr.Compile()' compile l'expression en vrai IL. La performance est la même que si l'expression lambda était compilée à la compilation, donc c'est aussi bon que possible :-) – dtb

3

qu'en est-il de Activator.CreateInstance?

échantillon:

string typeName = ...; 
Activator.CreateInstance(Type.GetType(typeName), params); 
+0

il y a une surcharge de CreateInstance qui vous permet de spécifier les arguments du constructeur. Ce serait votre meilleur pari. – Tejs

+0

Cela fonctionnera bien, sauf s'il doit le faire des milliers de fois par seconde, auquel cas un délégué compilé serait beaucoup mieux. – Gabe

+0

Je cherche un délégué compilé: - \ Ce sera exécuté sur un site web, et j'aimerais que les dégradations de performance de la réflexion se produisent une fois au chargement si possible. – TJMonk15

Questions connexes