C# 如何从类型';s名称和程序集';姓名

C# 如何从类型';s名称和程序集';姓名,c#,reflection,C#,Reflection,我需要获取一个类型的实例,该类型的名称和程序集名称将在运行时保留。我预先知道该类型将有一个无参数构造函数。最简单的方法是什么 这比我希望的要难 编辑:我不确定这是否相关,但程序集将被引用。我不需要从磁盘或其他地方加载它。以下内容就足够了: var assmebly = Assembly.Load("FullyQualifiedAssemblyName"); var type = assmebly.GetType("FullTypeName"); var instance = Activator.

我需要获取一个类型的实例,该类型的名称和程序集名称将在运行时保留。我预先知道该类型将有一个无参数构造函数。最简单的方法是什么

这比我希望的要难


编辑:我不确定这是否相关,但程序集将被引用。我不需要从磁盘或其他地方加载它。

以下内容就足够了:

var assmebly = Assembly.Load("FullyQualifiedAssemblyName");
var type = assmebly.GetType("FullTypeName");
var instance = Activator.CreateInstance(type);
发件人:

Activator.CreateInstance方法(字符串,字符串)

使用命名程序集和默认构造函数创建指定名称的类型的实例

public static ObjectHandle CreateInstance(
  string assemblyName,
  string typeName
)
例如:

Type referencedType=typeof(参考类型);
AreReferencedType实例=Activator.CreateInstance();
或
Type Type=Type.GetType(“类型的全名”);
对象实例=Activator.CreateInstance(类型);

如果引用System.Web.dll对您来说不是问题,那么有一种鲜为人知的方法非常有效。它甚至不需要程序集名称,因为它在当前AppDomain执行路径中扫描程序集中的类型

因此,代码应该是:

object instance = Activator.CreateInstance(BuildManager.GetType("MyNamespace.MyClass", true));


下面是一些使用奇特的
dynamic
关键字的功能。您需要引用其他类以通过测试,或者使用生成事件在生成的DLL上进行复制

namespace TestLibrary
{
    [TestFixture]
    public class Tests
    {
        [Test]
        public void FileCheck()
        {
            dynamic otherClass = 
                AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap("OtherLibrary.dll",                
                    "Prefix.OtherLibrary.SomeClass");
            otherClass.SayHello();   // look, ma! no casting or interfaces!
        }
    }
}

namespace Prefix.OtherLibrary
{
    public class SomeClass
    {
        public void SayHello()
        {
            Console.WriteLine("Hello, world.");
        }
    }
}

Activator
不同,
AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap
将文件名作为第一个参数,而不是类型说明符。这有时很有用,尤其是当您不关心程序集的强名称时。

@David:问题出在哪里?我添加了一个工作示例;这有帮助吗?可能是因为我没有为程序集指定版本、区域性和PublicKeyToken,所以它不起作用。但这些例子似乎并不能做到这一点,事实上鲜为人知。谢谢你的提示。非常有用和方便。如果core>采用有趣的方法,则会更有用。我认识你吗?我在运行时只有程序集和类的名称。在第二个代码段中,GetType不也需要程序集的名称吗?我想是的。@David,如果你使用完全限定类型名,那就不需要程序集的名称了。总之,这一切都很好。@David,是的,这是.net用字符串唯一标识类型的方法。请注意,第二种方法是不安全的,即重构(如果更改类型的名称,则在构建时不会出错)。关于缺乏安全性,您是完全正确的,但我看不到解决方法。调用类型的引用必须以某种方式存储在数据库中…这是我使用的方法,我正在标记这个方法。谢谢
Type referencedType = typeof(AReferencedType);
AReferencedType instance = Activator.CreateInstance<AReferencedType>();

or 

Type type = Type.GetType("Type's full name");
object instance = Activator.CreateInstance(type);
object instance = Activator.CreateInstance(BuildManager.GetType("MyNamespace.MyClass", true));
Activator.CreateInstance(Type.GetType("System.Int32"));
namespace TestLibrary
{
    [TestFixture]
    public class Tests
    {
        [Test]
        public void FileCheck()
        {
            dynamic otherClass = 
                AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap("OtherLibrary.dll",                
                    "Prefix.OtherLibrary.SomeClass");
            otherClass.SayHello();   // look, ma! no casting or interfaces!
        }
    }
}

namespace Prefix.OtherLibrary
{
    public class SomeClass
    {
        public void SayHello()
        {
            Console.WriteLine("Hello, world.");
        }
    }
}