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>的一个列表,念不通顺。

本回答被提问者采纳
参考技术C typeof(类名) 不知道是不是你要的东西追问

不行,得到就是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!";
    }
}
View Code

调用类:

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();

        }
    }
}
View Code

运行结果:

示例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!";
        }
    }
}
View Code

新建类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();

        }
    }
}
View Code

拷贝HelloWorld.dll到当前项目,并F5运行,调用成功后的信息如下所示:

 到此,两个演示的例子已经完成,希望通过不断的使用,我们都能不断提高!

以上是关于C#如何通过类名获取类,并进行相应的操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过类名获取类类型?

C# webBrowser1 如何按类获取元素?

C#反射执行方法返回List,怎么获取List

前端技术之:如何通过类的属性获取类名

C# 根据数字值获取相应枚举

C#通过反射获取类中的方法和参数个数,反射调用方法带参数