首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态型Activator.CreateInstance

动态型Activator.CreateInstance
EN

Stack Overflow用户
提问于 2014-04-16 09:27:52
回答 3查看 10.7K关注 0票数 5

我想我不太明白到底发生了什么:用户可以输入到程序集和对象类型的路径,然后尝试创建它的一个实例。

我的方法:

代码语言:javascript
复制
        Assembly a = Assembly.LoadFile(txtAssemblyPath.Text);
        Type myType = a.GetTypes().ToList().FirstOrDefault(f => f.Name == txtObjectName.Text);

        var obj = Activator.CreateInstance<myType>();
        var obj2 =(myType) Activator.CreateInstance(myType);

问题在于对象本身的创建。myType似乎不是一个类型。在本例中:Creating generic variables from a type - How? Or use Activator.CreateInstance() with properties { } instead of parameters ( )?

他们只是得到了一个物体,所以我想这不是同一种情况。我完全不明白的是: CreateInstance (类型)有效,但是CreateInstance与类型不一样,但是T和类型应该是相同的: System.Type。

谢谢您的澄清。

马提亚斯

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-16 09:35:52

有一个使用上的区别..。当你写:

代码语言:javascript
复制
var obj = Activator.CreateInstance<myType>();

你把你的课当成一个类型,这是一个很好的方法。您使用的是具有类类型引用的泛型类型。

但在这里:

代码语言:javascript
复制
var obj2 =(myType) Activator.CreateInstance(myType);

您像使用实例(对象)一样使用类。你不能这样做,一个类就是一个模式。如果要调用第二个方法,则必须编写:

代码语言:javascript
复制
var obj2 =(myType) Activator.CreateInstance(typeof(myType));

此代码将创建类类型的实例,此实例将描述类myType。

我希望能说清楚。

类是一个模式,您可以用这个模式创建一个对象,它将是一个实例(类的内存对象)。

票数 3
EN

Stack Overflow用户

发布于 2014-04-16 09:54:24

当您使用泛型类型的方法(如Activator.CreateInstance<T>(); )时,您必须提供强类型 of T,这意味着您必须传递已知的类型名称,而不是T。

代码语言:javascript
复制
var activatorPerson = (Person)Activator.CreateInstance<Person>();

这就是为什么有一个非泛型形式的Activator.CreateInstance(typeGoesHere)函数,可以在创建对象时没有强类型的情况下使用。因此,我们可以将类型作为参数传递给该函数。我们可以以多种方式提供类型变量。在您的示例中,您可以找到程序集中的适当类型如下:

代码语言:javascript
复制
Type myType = a.GetTypes().ToList().FirstOrDefault(f => f.Name == txtObjectName.Text);

此外,您还必须注意,在代码中键入的显式强制转换无效:

代码语言:javascript
复制
obj2 =(myType) Activator.CreateInstance(myType);

因为您必须为显式转换提供强类型名称。当我们在运行时无法访问强类型名称时,我们必须使用非泛型版本的方法。

票数 3
EN

Stack Overflow用户

发布于 2018-03-05 12:27:25

这是纯粹的动态方式。

这是工厂类和动态实例创建方法:

代码语言:javascript
复制
    public class RepositoryFactory
{
    public static dynamic CreateDynamic<TEntity>() where TEntity : BaseEntity
    {
        dynamic repositoryInstance = null;
        var subRepositories = AssemblyHelper.GetSubclassesOf(typeof(BaseRepository<TEntity>), true);
        var entityTypeName = typeof(TEntity).Name;
        var subRepository = subRepositories.FirstOrDefault(x => x.Name == entityTypeName + "Repository");
        if (subRepository != null)
        {
            var repositoryType = subRepository.UnderlyingSystemType;
            repositoryInstance = Activator.CreateInstance(repositoryType);
        }
        return repositoryInstance;
    }
}

这是用于在实体和存储库之间映射类型的助手类。

代码语言:javascript
复制
public static class AssemblyHelper
{
        public static List<Type> GetSubclassesOf(Type type, bool ignoreSystem)
        {
            List<Type> lReturn = new List<Type>();
            foreach (var a in System.Threading.Thread.GetDomain().GetAssemblies())
            {
                if (ignoreSystem && a.FullName.StartsWith("System."))
                {
                    continue;
                }
                foreach (var t in a.GetTypes())
                {
                    if (t.IsSubclassOf(type) || (type.IsInterface && t.GetInterfaces().FirstOrDefault(e => e.FullName == type.FullName) != null))
                    {
                        lReturn.Add(t);
                    }
                }
            }
            return lReturn;
        }
}

这是用于用例的Manager类:

代码语言:javascript
复制
public class PageManager
{
    private readonly ContentPageRepository _pageRepository;
    public PageManager()
    {
        _pageRepository = RepositoryFactory.CreateDynamic<ContentPage>();
    }

    public void GetPagesByContentType(ContentType type)
    {
        var pages = _pageRepository.GetByPredicate(x => x.Status != EntityStatus.Deleted && x.Node.Type == type);
        foreach (var page in pages)
        {
            //Deal with it :)
        }

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

https://stackoverflow.com/questions/23105264

复制
相关文章

相似问题

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