我想我不太明白到底发生了什么:用户可以输入到程序集和对象类型的路径,然后尝试创建它的一个实例。
我的方法:
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。
谢谢您的澄清。
马提亚斯
发布于 2014-04-16 09:35:52
有一个使用上的区别..。当你写:
var obj = Activator.CreateInstance<myType>();你把你的课当成一个类型,这是一个很好的方法。您使用的是具有类类型引用的泛型类型。
但在这里:
var obj2 =(myType) Activator.CreateInstance(myType);您像使用实例(对象)一样使用类。你不能这样做,一个类就是一个模式。如果要调用第二个方法,则必须编写:
var obj2 =(myType) Activator.CreateInstance(typeof(myType));此代码将创建类类型的实例,此实例将描述类myType。
我希望能说清楚。
类是一个模式,您可以用这个模式创建一个对象,它将是一个实例(类的内存对象)。
发布于 2014-04-16 09:54:24
当您使用泛型类型的方法(如Activator.CreateInstance<T>(); )时,您必须提供强类型 of T,这意味着您必须传递已知的类型名称,而不是T。
var activatorPerson = (Person)Activator.CreateInstance<Person>();这就是为什么有一个非泛型形式的Activator.CreateInstance(typeGoesHere)函数,可以在创建对象时没有强类型的情况下使用。因此,我们可以将类型作为参数传递给该函数。我们可以以多种方式提供类型变量。在您的示例中,您可以找到程序集中的适当类型如下:
Type myType = a.GetTypes().ToList().FirstOrDefault(f => f.Name == txtObjectName.Text);此外,您还必须注意,在代码中键入的显式强制转换无效:
obj2 =(myType) Activator.CreateInstance(myType);因为您必须为显式转换提供强类型名称。当我们在运行时无法访问强类型名称时,我们必须使用非泛型版本的方法。
发布于 2018-03-05 12:27:25
这是纯粹的动态方式。
这是工厂类和动态实例创建方法:
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;
}
}这是用于在实体和存储库之间映射类型的助手类。
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类:
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 :)
}
}
}https://stackoverflow.com/questions/23105264
复制相似问题