我对在c#中使用反射相当缺乏经验,所以我尝试遵循这里的官方示例来掌握事情是如何工作的。为了使它更接近我的真实世界场景,我对代码进行了一些更改:
public class Example
{
public static void Generic<T>(T toDisplay)
{
Console.WriteLine("rnHere 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
az,您可以看到:
Type myType = Type.GetType("Example");
但是这里的问题是myType
是null
,在最后我得到例外,因为这一点。我尽量让事情变得简单。从我的示例中可以看到,所有类都在一个文件中,共享相同的名称空间。我应该如何修改我的代码,使我可以使用字符串来获得这种类型?
需要指定类型的全名,包括命名空间:
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"));