1

抽象基本クラス Packet と Packet のサブクラスを持つ外部 DLL を使用しています。

サブクラスは、それらが表す番号に基づいて名前が付けられます。1 つの名前は P132_RandomString の可能性があります。これらの数値を含むファイルを解析しており、数値ごとに対応するオブジェクトを作成したいと考えています。何百もの異なるサブクラスがあり、DLL にはファクトリ メソッドがありません (少なくとも私の入力では)。

問題は、「RandomString」の部分がわからないことです。もしそうなら、リフレクションを使用できたはずですが、クラス名の先頭しか知らないため、リフレクションを使用する方法はないと思いますか?

私が考えることができる唯一の解決策は、何百ものケースステートメントを使用して独自のファクトリメソッドを実装することですが、これは少し面倒です...

私の質問は次のとおりです。これを行う良い方法はありますか?

4

4 に答える 4

2

LINQ Where句を使用して、必要なタイプを取得できます。次のプログラムを検討してください:(これは、基本クラスとプレフィックスを知っていることを前提としています)

class Program {
    static void Main( string[] args ) {

        string prefix = "p22";
        IEnumerable<Type> types = Assembly.LoadFrom("c:\\Sample.Assembly.dll").GetTypes();    
        Type baseClass = typeof(foo);
        Type foundType = types.Where(
            t => t.Name.StartsWith( prefix ) &&
                t.IsSubclassOf( baseClass )
                ).SingleOrDefault();
        foo myClass = (foo)Activator.CreateInstance( foundType );
                //Do Stuff with myClass 
    }
}
abstract class foo { }
class p22_notMyClass { }
class p22_myclass : foo { }
}
于 2012-07-31T18:24:42.820 に答える
0

メソッドを使用Assembly.GetTypes()して型を反復し、名前に番号が含まれているクラスを見つけることができます。次に、Activator.CreateInstanceを使用してインスタンスを取得できます。

于 2012-07-31T18:26:09.643 に答える
0

アセンブリ使用からすべての型をロードするにはAssembly.GetTypes

 var objects = new List<Object>();
 Assembly SampleAssembly;
 SampleAssembly = Assembly.LoadFrom("c:\\Sample.Assembly.dll");
 // Obtain a reference to types known to exist in assembly.
 Type[] types = SampleAssembly.GetTypes();
 foreach(Type t in types)
    if(t.Name.StartsWith("P132")
       objects.Add(Activator.CreateInstance(t));

ここに記載されている使用Activator.CreateInstance方法

于 2012-07-31T18:17:39.660 に答える
0

Assembly.GetTypesで+ some String.IndexOf(またはその他のマッチング) を使用しType.FullName + Activator.CreateInstance()ます。

于 2012-07-31T18:21:50.070 に答える