我在C#中使用Reflection非常缺乏经验,因此我尝试按照官方示例here来掌握事情的运作方式。为了使这更接近我的真实世界,我已经改变了一些代码:
public class Example
{
public static void Generic<T>(T toDisplay)
{
Console.WriteLine("\r\nHere it is: {0}", toDisplay);
}
}
class Program
{
public static void Main()
{
RefTests rt = new RefTests();
rt.ExecuteMethodWithReflection();
}
}
public class RefTests
{
public void ExecuteMethodWithReflection()
{
//Type myType = typeof(Example);
Type argType = Type.GetType("System.Int32");
Type myType = Type.GetType("Example");
MethodInfo method = myType.GetMethod("Generic");
MethodInfo generic = method.MakeGenericMethod(argType);
object[] args = { 42 };
generic.Invoke(null, args);
}
}
这里的问题在于ExecuteMethodWithReflection()
方法。在最初的示例中,它显示了定义方法的类的类型如下所示:
Type myType = typeof(Example);
然而,在我的真实情况中,Example
将是一个字符串,我需要将其转换为类类型Example
,您可以看到:
Type myType = Type.GetType("Example");
但问题在于myType
是null
而在edn我因此而异常。我尽量让事情变得简单。从我的示例中可以看出,所有类都在一个文件中,共享相同的命名空间。我怎么修改我的代码所以我可以使用字符串来获得这种类型?
答案 0 :(得分:3)
您需要指定类型的全名,包括命名空间:
Type myType = Type.GetType("ConsoleApplication1.Example");
int
的示例有效,因为您还指定了名称空间"System.Int32"
。如果仅提供"Int32"
,则会返回null
。
像 Sriram Sakthivel 注意到的那样,没有汇编限定名称的Type.GetType
仅适用于
在当前正在执行的程序集中或在Mscorlib.dl中
否则 - 您需要提供该类型的程序集限定名称。
修改强> 为了获得类型,你可以这样做:
Assembly assm = Assembly.GetExecutingAssembly();
//Assembly assm = Assembly.GetCallingAssembly();
//Assembly assm = Assembly.GetEntryAssembly();
//Assembly assm = Assembly.Load("//");
// it depends in which assmebly you are expecting the type to be declared
// Single protects us - if more than one "Example" type will be found (with different namespaces)
// throws exception (we don't know which type to use)
// when null - type not found
Type myType = assm.GetTypes().SingleOrDefault(type => type.Name.Equals("Example"));