我使用的是一个外部DLL,它有一个抽象的基类包和要包的子类。
这些子类是以它们所代表的数字命名的,其中一个名称可以是P132_RandomString。我正在解析一个包含这些数字的文件,并为每个数字创建一个相应的对象。有成百上千个不同的子类,DLL没有工厂方法(至少我的输入没有工厂方法)。
问题是我不知道"RandomString“部分,如果我知道,我可以使用反射,但我假设没有办法使用反射,因为我只知道类名的开头?
我能想到的唯一解决方案是使用数百条case语句实现我自己的工厂方法,但这感觉有点麻烦……
我的问题是:有没有一个很好的方法来做到这一点?
发布于 2012-08-01 02:24:43
可以使用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-08-01 02:17:40
要从程序集中加载所有类型,请使用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));使用here描述的Activator.CreateInstance方法
发布于 2012-08-01 02:21:50
在Type.FullName + Activator.CreateInstance()上使用Assembly.GetTypes +一些String.IndexOf (或其他匹配)。
https://stackoverflow.com/questions/11746450
复制相似问题