【问题标题】:Type instantiation from an assembly in C#从 C# 中的程序集类型实例化
【发布时间】:2015-02-27 10:56:54
【问题描述】:

有可能做这样的事情吗?

  1. 创建一个类并将其放入程序集中,例如

    namespace some
    {
        public class foo{
            ..etc
    }
    
  2. 加载到当前appdomain中

    Assembly.LoadFrom("some.foo.dll");
    
  3. 输出类型

    Type t = Type.GetType("some.foo");
    

基本上无论如何都可以将实际类型放入 t 中?

【问题讨论】:

  • 这可能与您想要的类似:stackoverflow.com/q/12096695/1026459
  • “实际类型”是指实例?
  • 我不确定我是否理解您的问题。也许你想做var a = Assembly.LoadFrom("some.foo.dll"); 然后var t = a.GetType("some.foo");
  • 是的,这正是我想要表达的 :) 我认为我犯的错误是我认为 Assembly.Load 会将类型直接加载到 appdomain 中。谢谢。

标签: c# reflection types


【解决方案1】:

我不确定我是否理解这个问题。我想你想实例化类型。

这会调用公共默认构造函数:

// specify the full name and assembly name, to make sure that you get the some.foo
// from the assembly in question.
Type t = Type.GetType("some.foo, some.foo");
object instance = Activator.CreateInstance(t);

查看调用其他构造函数的重载。

【讨论】:

  • CreateInstance 不会创建一个完全类型化的 foo,如果你想将它作为 foo 类型的 foo 传递,你必须强制转换它。
  • 投到什么?当您动态加载程序集时,您通常不知道类型。否则,您只需直接调用构造函数。至少有一个接口是有意义的,但问题不在于这个。
【解决方案2】:

您可以使用反射来实例化对象。例如,使用默认构造函数进行实例化:

Type.GetType("Foo").GetConstructor().Invoke();

要使用带有字符串的构造函数进行实例化,请使用:

Type.GetType("Foo").GetConstructor(new[] { typeof(string) }).Invoke(new [] { "bar" });

【讨论】:

  • 当你知道Foo,为什么不直接打电话给new Foo()
  • 好点。我将从示例中删除变量,因为正如您所说,我们假设我们不知道 foo。
【解决方案3】:
var assembly = Assembly.LoadFrom("SomeAssembly.dll");
assembly.GetType("SomeType");

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 2023-03-19
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2017-03-26
    相关资源
    最近更新 更多