首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从不同程序集中的类名解析类型

从不同程序集中的类名解析类型
EN

Stack Overflow用户
提问于 2010-08-18 21:00:37
回答 4查看 73.9K关注 0票数 94

我有一个方法,需要解析一个类的类型。此类存在于另一个程序集中,其命名空间类似于:

代码语言:javascript
复制
MyProject.Domain.Model

我正在尝试执行以下操作:

代码语言:javascript
复制
Type.GetType("MyProject.Domain.Model." + myClassName);

如果执行此操作的代码与我试图解析其类型的类位于同一程序集中,则此方法非常有效。但是,如果我的类位于不同的程序集中,则此代码将失败。

我确信有一种更好的方法来完成这项任务,但我在解析程序集和遍历命名空间以解析我要查找的类类型方面没有太多经验。有什么建议或技巧可以更优雅地完成这项任务吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-18 21:03:53

您必须像这样添加程序集名称:

代码语言:javascript
复制
Type.GetType("MyProject.Domain.Model." + myClassName + ", AssemblyName");

为避免歧义或如果程序集位于GAC中,应提供完全限定的程序集名称,如下所示:

代码语言:javascript
复制
Type.GetType("System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
票数 186
EN

Stack Overflow用户

发布于 2016-06-27 15:17:14

首先加载程序集,然后加载类型。

示例:

代码语言:javascript
复制
Assembly DLL = Assembly.LoadFile(PATH);
DLL.GetType(typeName);
票数 2
EN

Stack Overflow用户

发布于 2019-05-29 15:17:58

与OP类似,我需要按名称加载有限的类型子集(在我的示例中,所有类都在单个程序集中,并实现相同的接口)。在尝试对不同的程序集使用Type.GetType(string)时(甚至添加了其他帖子中提到的AssemblyQualifiedName ),我遇到了很多奇怪的问题。下面是我是如何解决这个问题的:

用法:

代码语言:javascript
复制
var mytype = TypeConverter<ICommand>.FromString("CreateCustomer");

代码:

代码语言:javascript
复制
    public class TypeConverter<BaseType>
        {
            private static Dictionary<string, Type> _types;
            private static object _lock = new object();

            public static Type FromString(string typeName)
            {
                if (_types == null) CacheTypes();

                if (_types.ContainsKey(typeName))
                {
                    return _types[typeName];
                }
                else
                {
                    return null;
                }
            }

            private static void CacheTypes()
            {
                lock (_lock)
                {
                    if (_types == null)
                    {
                        // Initialize the myTypes list.
                        var baseType = typeof(BaseType);
                        var typeAssembly = baseType.Assembly;
                        var types = typeAssembly.GetTypes().Where(t => 
                            t.IsClass && 
                            !t.IsAbstract && 
                            baseType.IsAssignableFrom(t));

                        _types = types.ToDictionary(t => t.Name);
                    }
                }
            }
        }

显然,您可以调整CacheTypes方法以检查AppDomain中的所有程序集,或者更适合您的用例的其他逻辑。如果您的用例允许从多个命名空间加载类型,则可能需要更改字典键以使用类型的FullName。或者,如果您的类型不是从公共接口或基类继承的,则可以删除<BaseType>并将CacheTypes方法更改为使用类似.GetTypes().Where(t => t.Namespace.StartsWith("MyProject.Domain.Model.")的方法

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

https://stackoverflow.com/questions/3512319

复制
相关文章

相似问题

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