2010-12-02 7 views
2

J'ai besoin de mes sous-classes de DataContext et je trouve la fonction ci-dessous pour ce qui traîne quelque part et il trouve que ma sous-classe, mais je ne peux pas instancier :(Comment faire Activator.CreateInstance pour différents constructeurs?

public static IEnumerable<T> GetSubclassesFor<T>(Assembly assembly) 
    { 
    return (assembly.GetTypes() 
    .Where(t => t.BaseType == (typeof (T))) 
    .Select(t => (T) Activator.CreateInstance(t, new object[] {"asdasd"}))) 
    .ToList(); 
    } 

Je reçois le message d'erreur suivant:

System.Reflection.TargetInvocationException : Ett undantagsfel har inträffat i MALET för en aktivering ----> System.TypeInitializationException:. Typinitieraren för PlaynGO.Cashier.Da ta.CashierDC utlöste ett undantag. ----> System.NullReferenceException: Objektreferensen har inte angetts jusqu'à dans instans av ett objekt. vid System.RuntimeMethodHandle. InvokeConstructor (IRuntimeMethodInfo méthode , Object [] args, ref signature SignatureStruct, RuntimeType DeclaringType) vid System.Reflection.RuntimeConstructorInfo.Invoke (BindingFlags invokeAttr, liant Binder, objet [] paramètres , culture CultureInfo) vid système .RuntimeType.CreateInstanceImpl (BindingFlags bindingAttr, liant Binder, Object [] args , culture CultureInfo, Object [] activationAttributes) vid System.Activator.CreateInstance (type type , Object [] args) vid PlaynGO.Dbml. Reflexion.b _3 (Type t) i Reflexion.cs: ligne 23 vid System.Linq.Enumerable.WhereSelectArrayIterator 2.MoveNext() vid System.Collections.Generic.List 1..ctor (IEnumerable 1 collection) vid System.Linq.Enumerable.ToList(IEnumerable une source ) vid PlaynGO.Dbml.Reflexion.GetInstances (Assemblée assemblage) i Reflexion.cs: ligne 23 vid PlaynGO.Dbml.UnitTests.TestReflection.TestGettingTypes (i) TestReflection.cs: ligne 21 --TypeInitializationException vid PlaynGO.Cashier.Data.CashierDC..ctor (connexion à cordes ) --NullReferenceException vid PlaynGO. Cashier.Data.CashierDC..cctor()

Le constructeur que je veux d'appeler est le suivant:

public CashierDC(string connection) : 
    base(connection, mappingSource) 

MappingSource est directement instanciée et un champ d'instance. Où vais-je mal? Que dois-je faire pour que cela fonctionne?

PS. This is .NET 4.0

+0

Veuillez essayer de traduire le message d'erreur. –

+0

LOL ..Il a dit "do do" ... :) –

+0

Le cctor n'est-il pas le constructeur statique? En a-t-il un et si oui pouvez-vous l'afficher? –

Répondre

2

L'exception TargetInvocationException indique que le constructeur qu'il appelle a levé une exception. Peut-être est-ce dû à la valeur réelle que vous passez pour la chaîne de connexion. Vous pouvez essayer d'utiliser le débogueur et définir un point d'arrêt dans le constructeur en prenant une chaîne de connexion et (1) assurez-vous qu'il est invoqué et (2) déterminer où l'exception se produit.

+0

Merci d'avoir pris le temps. Vous aviez raison, il était problème ServiceLocator :(Je voudrais n'étais jamais allé dans cette voie sombre. – mhenrixon

5

Je pense que votre erreur est autre chose. Si Activator.CreateInstance ne trouve pas votre constructeur, vous obtenez un MissingMethodException et non un TargetInvocationException. Je soupçonne qu'il y a autre chose qui ne va pas dans la classe que vous essayez d'instancier.

+0

Je suis d'accord, il semble que vous obtenez un NullReferenceException jeté dans votre constructeur. Si vous souhaitez effectuer une double vérification, exécutez le débogueur et définir un point d'arrêt sur votre constructeur pour voir s'il est appelé –

+0

merci d'avoir répondu à la question, c'était autre chose et je me déteste pour ça maintenant. – mhenrixon

Questions connexes