反射的用法

本文介绍了使用C#进行反射操作、动态实例化对象、创建类型及动态加载DLL的方法,并展示了如何通过反射获取System.Object和System.String的信息,利用动态调用创建Employee实例并调用其方法,以及创建新的类型并调用其中的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 一TypeExployer

 

 class Program
    
{
        
static void Main(string[] args)
        
{
           
            
//ExploreSystemObject();
            ExploreStringConstructor();
            Console.ReadLine();
        }

        
static void ExploreSystemObject()
        
{
            Type t 
= Type.GetType("System.Object");
            Console.WriteLine(
"FullName: " + t.FullName);
            Console.WriteLine(
"AssemblyQualifiedName: " + t.AssemblyQualifiedName);
            Console.WriteLine(
"GUID: " + t.GUID);
            Console.WriteLine(
"IsAbstract: " + t.IsAbstract);
            Console.WriteLine(
"IsClass: " + t.IsClass);
            Console.WriteLine(
"IsInterface: " + t.IsInterface);
            Console.WriteLine(
"IsSealed: " + t.IsSealed);
            MemberInfo[] members 
= t.GetMembers();
            
foreach (MemberInfo m in members)
            
{
                Console.WriteLine(
" {0}", m);
            }

        }

        
static void ExploreStringConstructor()
        
{
            Type t 
= Type.GetType("System.String");
            Console.WriteLine(
"FullName: " + t.FullName);
            Console.WriteLine(
"AssemblyQualifiedName: " + t.AssemblyQualifiedName);
            Console.WriteLine(
"GUID: " + t.GUID);
            Console.WriteLine(
"IsAbstract: " + t.IsAbstract);
            Console.WriteLine(
"IsClass: " + t.IsClass);
            Console.WriteLine(
"IsInterface: " + t.IsInterface);
            Console.WriteLine(
"IsSealed: " + t.IsSealed);
            ConstructorInfo[] constructorArray 
= t.GetConstructors();
            Console.WriteLine(
"Constructors: " + constructorArray.Length);
            
foreach (ConstructorInfo c in constructorArray)
            
{
                Console.WriteLine(
" {0}", c);
                ParameterInfo[] parameterArray 
= c.GetParameters();
                
foreach (ParameterInfo p in parameterArray)
                
{
                    Console.WriteLine(
" {0}", p.Name);
                }

            }

        }

    }

二 DynamicInvocation

 

class Program
    
{
        
static void Main(string[] args)
        
{
            Type t 
= typeof(Employee);
            
object[] ctorParams = "qiuwh""RDCenter" };
            Object o 
= Activator.CreateInstance(t, ctorParams);
            MethodInfo myMethod 
= t.GetMethod("ToString");
            Console.WriteLine(myMethod.Invoke(o, 
null));
            Console.ReadLine();
        }

    }

    
class Employee
    
{
        
public string Name;
        
public string Dept;
        
public Employee(string name, string dept)
        
{
            
this.Name = name;
            
this.Dept = dept;
        }

        
public override string ToString()
        
{
            
return string.Format("Name:{0}, Dept:{1}"this.Name, this.Dept);
        }

    }

 

三 DynamicCreateType

 

class Program
    
{
        
static void Main(string[] args)
        
{
            CreateType();
            Console.ReadLine();
        }

        
static void CreateType()
        
{
            AssemblyName assemblyName 
= new AssemblyName("MyAssembly");
            AssemblyBuilder assemblyBuilder 
= Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
            ModuleBuilder moduleBuilder 
= assemblyBuilder.DefineDynamicModule("MyModule""MyAssembly.dll"true);
            TypeBuilder typeBuilder 
= moduleBuilder.DefineType("Sample.NewType", TypeAttributes.Public);
            MethodBuilder methodBuilder 
= typeBuilder.DefineMethod("MyMethod", MethodAttributes.Public, nullnull);
            CreateMethodBody(methodBuilder);
            typeBuilder.CreateType();
            assemblyBuilder.Save(
"MyAssembly.dll");
           
            Type t 
= Type.GetType("Sample.NewType, MyAssembly"true);
            Object o 
= Activator.CreateInstance(t);
            MethodInfo myMethod 
= t.GetMethod("MyMethod");
            Console.WriteLine(myMethod.Invoke(o, 
null));       
        }

        
static void CreateMethodBody(MethodBuilder m)
        
{
            ILGenerator il 
= m.GetILGenerator();
            il.EmitWriteLine(
"Hello World! from a new type");
            il.Emit(OpCodes.Ret);
        }

    }

 

四 AssemblyExplorer

class Program
    {
        /*
   * 动态载入dll,判断此assembly中哪些类属于 System.Web.UI 命名空间下,
   * 并且扩展了IDisposable接口,打印出这些类以及他们的所有接口。
   */
        static void Main(string[] args)
        {
            Assembly assembly = Assembly.LoadFrom(@"C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/System.Web.dll");

            Type[] types = assembly.GetTypes();
            foreach (Type type in types)
            {
                if ("System.Web.UI".Equals(type.Namespace) && type.IsClass && type.GetInterface("IDisposable") != null)
                {
                    Console.WriteLine("Class Name:" + type.FullName);
                    Type[] TypeInterfaces = type.GetInterfaces();
                    foreach (Type TypeInterface in TypeInterfaces)
                    {
                        Console.WriteLine(TypeInterface.Name);
                    }
                    Console.WriteLine();
                }
            }
            Console.ReadLine();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值