首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当知道C#中类名的一部分时,动态创建对象

当知道C#中类名的一部分时,动态创建对象
EN

Stack Overflow用户
提问于 2012-08-01 02:14:44
回答 4查看 258关注 0票数 1

我使用的是一个外部DLL,它有一个抽象的基类包和要包的子类。

这些子类是以它们所代表的数字命名的,其中一个名称可以是P132_RandomString。我正在解析一个包含这些数字的文件,并为每个数字创建一个相应的对象。有成百上千个不同的子类,DLL没有工厂方法(至少我的输入没有工厂方法)。

问题是我不知道"RandomString“部分,如果我知道,我可以使用反射,但我假设没有办法使用反射,因为我只知道类名的开头?

我能想到的唯一解决方案是使用数百条case语句实现我自己的工厂方法,但这感觉有点麻烦……

我的问题是:有没有一个很好的方法来做到这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-01 02:24:43

可以使用LINQ Where子句来获取所需的类型。考虑以下程序:(假设您知道基类和前缀)

代码语言:javascript
复制
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 { }
}
票数 2
EN

Stack Overflow用户

发布于 2012-08-01 02:17:40

要从程序集中加载所有类型,请使用Assembly.GetTypes

代码语言:javascript
复制
 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方法

票数 0
EN

Stack Overflow用户

发布于 2012-08-01 02:21:50

Type.FullName + Activator.CreateInstance()上使用Assembly.GetTypes +一些String.IndexOf (或其他匹配)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11746450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档