1

我正在使用一个外部 DLL,它有一个抽象的基类 Packet 和 Packet 的子类。

子类以其代表的数字命名,一个名称可以是 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

 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 回答
0

您可以使用Assembly.GetTypes()方法并迭代类型并找出哪个类的名称中有数字。然后你可以使用 Activator.CreateInstance 来获取一个实例。

于 2012-07-31T18:26:09.643 回答