2010-12-02 20 views
2

私はDataContextのの私のサブクラスを取得する必要があり、私はそれがどこかに転がっについては、以下の機能を発見し、それは確かに私のサブクラスを見つけたが、私はそれをインスタンス化することはできません:(様々なコンストラクタのActivator.CreateInstanceの操作方法は?

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(); 
    } 

私は、次のエラーメッセージが表示されます。

System.Reflection.TargetInvocationException :エットundantagsfel HARinträffat私 måletための専用aktivering ----> System.TypeInitializationException:。 PlaynGO.Cashier.Daため Typinitieraren ta.CashierDCutlöste ett undantag。 ----> System.NullReferenceException: オブジェクト参照は、 までエンジェルオブジェクトがありません。 vid System.RuntimeMethodHandle。 InvokeConstructor(IRuntimeMethodInfo 方法、[]引数、REF SignatureStruct署名、RuntimeType declaringType物体)VID System.Reflection.RuntimeConstructorInfo.Invoke(のBindingFlags invokeAttr、バインダーバインダー、オブジェクト[] パラメータのCultureInfo培養)VID システム.RuntimeType.CreateInstanceImpl VID PlaynGO.Dbml VID System.Activator.CreateInstance(引数タイプ タイプ、オブジェクト[]()のBindingFlags bindingAttr、バインダーバインダーは、[] activationAttributesオブジェクト、[] 引数、CultureInfoカルチャオブジェクト)。 Reflexion.b _3(タイプ t)はI Reflexion.cs:ライン23 VID System.Linq.Enumerable.WhereSelectArrayIterator 2.MoveNext() vid System.Collections.Generic.List 1..ctor(IEnumerableをソース)VID PlaynGO.Dbml.Reflexion.GetInstances(アセンブリ アセンブリ)I Reflexion.cs。ライン23 VID PlaynGO.Dbml.UnitTests.TestReflection.TestGettingTypes() I TestReflection.cs:ライン21 --TypeInitializationException VID PlaynGO.Cashier.Data.CashierDC..ctor(文字列 接続) --NullReferenceException VID PlaynGO。 Cashier.Data.CashierDC..cctor()

私が欲しいコンストラクタto callは次のとおりです。

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

MappingSourceはインスタンス化され、インスタンスフィールドです。どこが間違っていますか?私はこの仕事をするために何をしなければなりませんか?

PS。これは.NET 4.0です

+0

エラーメッセージを翻訳してみてください。 –

+0

LOL ..彼は "do do"と言った::) –

+0

cctorは静的コンストラクタではないのですか?それは1つ持っています、もしあなたがそれを投稿することができますか? –

答えて

2

TargetInvocationExceptionは、呼び出すコンストラクターが例外をスローしたことを示します。おそらく、これは接続文字列に渡す実際の値が原因です。デバッガを使用して、コンストラクタで接続文字列を取得し、(1)呼び出されていることを確認し、(2)例外の発生場所を判断することができます。

+0

ありがとうございました。あなたはそれがServiceLocatorの問題だったのは間違いありませんでした。(暗いパスを一度も行ったことがないといいですか?) – mhenrixon

5

あなたのエラーは別のものだと思います。 Activator.CreateInstanceがあなたのコンストラクタを見つけることができない場合、TargetInvocationExceptionではなくMissingMethodExceptionが得られます。インスタンス化しようとしている実際のクラスに何か間違っていると思われます。

+0

コンストラクタでNullReferenceExceptionがスローされているようです。コンストラクタのブレークポイントが呼び出されているかどうかを確認してください。 –

+0

質問にお答えいただき、ありがとうございました。 – mhenrixon

関連する問題