C#如何通过类名获取类,并进行相应的操作?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#如何通过类名获取类,并进行相应的操作?相关的知识,希望对你有一定的参考价值。
比如DataGrid列表控件有个数据源ItemSource=listA, DataGrid的Typestring属性(我自定义的)值为ClassA, 也就是listA的数据类型. 现在怎么把listA转换成类型为List<ClassA>的一个列表, 因为Typestring可能任意的一个类的类名, 所以需要一个通用的方法, 请大神指点啊
参考技术A 只有类名是不够的,要有程序集限定名称,例如:System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089。然后这样做:
Type tp = Type.GetType(String.Format("System.Collections.Generic.List`1[0]",Typestring));
dynamic obj = Activator.CreateInstance(tp);
obj.Clear();
等等。追问
谢谢!
参考技术B问得不够清楚。
ItemSource=listA,listA是不是一个确定的类型?
Typestring属性,大概是什么样?
listA转换成类型为List<ClassA>的一个列表,念不通顺。
不行,得到就是System.String,因为类名就是一个字符串
追答哦,那你用反射,先找到对应程序集,再找类
反射是个大概念,最好系统地看一下,再下手
反射(Reflection)
反射主要用于在程序运行期间动态解析相关类的类名,命名空间,属性,方法并进行相应操作,以下通过两个简单的例子进行了说明:
示例1:调用程序集内部方法,运行时动态获取相关类的信息,包括类名,命名空间等信息并进行对象的创建及方法的调用:
测试类:
class HI { public string Hi = "HelloWorld"; public string SayHello_CI() { return "Hello World!"; } public string SayHello_AC() { return "How are you!"; } }
调用类:
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.Remoting; using System.Text; using System.Threading.Tasks; namespace ReflectionLearning01 { class Program { static void Main(string[] args) { Type type = typeof(HI); //Create object using Assembly Assembly Assem = type.Assembly; Object objAssembly = Assem.CreateInstance("ReflectionLearning01.HI", true); //Creare object using Activator ObjectHandle handler = Activator.CreateInstance(null, "ReflectionLearning01.HI"); Object objActvator = handler.Unwrap(); //Call the function in another class string res_ci = (string)type.InvokeMember("SayHello_CI", BindingFlags.InvokeMethod, null, objAssembly, null); string res_ac = (string)type.InvokeMember("SayHello_AC", BindingFlags.InvokeMethod, null, objActvator, null); string Name = type.Name; string FullName = type.FullName; string NameSpace = type.Namespace; var Assembly = type.Assembly; var Module = type.Module; Console.WriteLine("ClassName:" + Name); Console.WriteLine("ClassFullName:" + FullName); Console.WriteLine("NameSpace:" + NameSpace); Console.WriteLine("Assembly:" + Assembly); Console.WriteLine("Module:" + Module); Console.WriteLine(res_ci); Console.WriteLine(res_ac); Console.ReadLine(); } } }
运行结果:
示例2:在当前程序集内部调用外部程序集即动态加载DLL,调用其中的方法并返回方法返回值:
新建类库项目HelloWorld,新增类的详细代码如下,生成.dll:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HelloWorld { public class HI { public string SayHello(string Hi) { return Hi+", current time is "+DateTime.Now.ToShortDateString()+",It\'s time to go home!"; } } }
新建类Windows 控制台程序ReflectionLearning,类的调用信息如下:
PS.不需要添加HelloWorld.dll到当前项目的引用中
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.Remoting; using System.Text; using System.Threading.Tasks; namespace ReflectionLearning01 { class Program { static void Main(string[] args) { Assembly assembly = System.Reflection.Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "HelloWorld.dll"); Type type = assembly.GetType("HelloWorld.HI"); object instance = assembly.CreateInstance("HelloWorld.HI"); //Parameter list Type[] ParmType = new Type[1]; ParmType[0] = Type.GetType("System.String"); Object[] parm_obj = new Object[1]; parm_obj[0] = "HelloWorld!"; object result = type.GetMethod("SayHello", ParmType).Invoke(instance, parm_obj); Console.WriteLine(result); Console.ReadLine(); } } }
拷贝HelloWorld.dll到当前项目,并F5运行,调用成功后的信息如下所示:
到此,两个演示的例子已经完成,希望通过不断的使用,我们都能不断提高!
以上是关于C#如何通过类名获取类,并进行相应的操作?的主要内容,如果未能解决你的问题,请参考以下文章