反射创建给定类型的程序集

时间:2014-09-16 11:35:12

标签: c# reflection

我试图从字符串中获取类类型。我觉得我可能会走很远的路,但这是我到目前为止的代码:

System.Reflection.MethodInfo method = typeof(MyClass).GetMethod("MyFunc");

string myInterfaceId = "ITest";
Type myType = _type;  // This is a WPF App that ultimately calls this process
                      // Debugger shows that _is correctly populated

AssemblyName an = new AssemblyName(myType.AssemblyQualifiedName);  // Error here
Assembly a = Assembly.Load(an);

System.Reflection.MethodInfo generic = method.MakeGenericMethod(
                a.GetType(myInterfaceId))

我得到的错误是:

A first chance exception of type 'System.IO.FileLoadException' occurred in mscorlib.dll

所以,我将程序集已经在内存中,因为它出错了。是否不可能使用反射来加载已经在内存中的程序集?有没有办法使用反射t加载它而不使用Assembly.Load(...

编辑:

感谢@stakx的建议,我终于想到了这个:

var meInterfaceType = myType.GetTypeInfo().Assembly.DefinedTypes.FirstOrDefault(k => k.Name == myInterfaceId)

3 个答案:

答案 0 :(得分:0)

假设您的项目未引用包含ITest的程序集,获取Type对象等同于typeof(ITest)的最简单方法可能是通过static Type.GetType method

// you need to specify the assembly-qualified name of your type parameter type:
var t = Type.GetType("FooNamespace.ITest, FooAssembly, Version=…, PublicKeyToken=…");

(如果您在项目中引用该程序集,只需设置t = typeof(FooNamespace.ITest)。)

然后继续关闭通用方法:

var openMethod = typeof(MyClass).GetMethod("MyFunc"); // as before
var closedMethod = openMethod.MakeGenericMethod(t);

答案 1 :(得分:0)

你可以得到这样的类型:

var type = Type.GetType("MyString");

然后使用激活器获取您的实例:

Activator.CreateInstance(type);

答案 2 :(得分:0)

使用AssemblyQualifiedName是最傻瓜式的字符串,但如果你的类在执行程序集中,那么namespace.ClassName可以正常工作。

var type = Type.GetType("AssemblyQualifiedNameOfTheClass or namespace.ClassName");
var thing = (MyClass)Activator.CreateInstance(type);

从这一点开始,你可以使用""就像你将使用" namespace.ClassName"。

的实例一样