インターフェイスを実装するクラスのリストを取得し、プログラムの後のある時点で、これらのクラスをインスタンス化して、コンストラクターにパラメーターを渡そうとしています。
前のStackOverflowページで、空のコンストラクターを使用してクラスをインスタンス化する次のコードを見ました。
var preprocessors = from t
in Assembly.GetExecutingAssembly().GetTypes()
where t.GetInterfaces()
.Contains(typeof(Preprocessing))
&& t.GetConstructor(Type.EmptyTypes) != null
select Activator.CreateInstance(t) as Preprocessing;
ただし、コンストラクターに何らかのパラメーターを渡さずに一部のクラスをインスタンス化することは望ましくありません(パラメーターは、forループで取得されるため、インスタンス化するまで待つ必要があります)。
インスタンス化するクラスのリストを取得するために、これを実行してみました。
var preprocessors = from t
in Assembly.GetExecutingAssembly().GetTypes()
select t.GetInterfaces()
.Contains(typeof(Preprocessing))
しかし、これを行った後、クラスにアクセスしてインスタンス化する方法がわかりませんでした。これに関するいくつかのガイダンスを本当にいただければ幸いです。ありがとう!
編集:Activator.CreateInstance(...)
かっこに何を入れるべきかわかりません。私はこのようなものを入れてみました:
foreach (var sim in similarities)
{
var a = Activator.CreateInstance(sim, preprocessedData) as Preprocessing;
しかし、それはエラーをスローしています。おそらく、preprocessedData
がDenseMatrix
オブジェクト(MathNet Numericsライブラリから)であるためです。DenseMatrix
配列ではなくパラメータとしてを送信する方法はありますか?
すべての回答に感謝します、彼らは私がこれを理解するのを助けるのに大いに役立ちました。
ここにある他の解決策のいくつかも私がしたことと同等かもしれませんが、これは私にとってはうまくいきました。
var preprocessors = from t in Assembly.GetExecutingAssembly().GetTypes()
where t.GetInterfaces().Contains(typeof(Preprocessing))
select Activator.CreateInstance(t, originalData) as Preprocessing; // Create instance of class with originalData as parameter
// Obtain a list of all types in the assembly (will be instantiated in the foreach loop)
var similarities = Assembly.GetExecutingAssembly().GetTypes();
これは、インスタンスを作成し、forループでパラメーターを渡した方法です。
foreach (var sim in similarities)
{
if (sim.GetInterfaces().Contains(typeof(Similarity))) // Check if the assembly types are of type Similarity
{
// Create instance of similarity class with preprocessedData as a parameter
var similarityObject = Activator.CreateInstance(sim, preprocessedData) as Similarity;
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加