C# 反射

本文详细探讨了C#中的反射机制,包括如何使用反射动态创建对象、获取类型信息、调用成员方法以及其在实际开发中的应用和注意事项。通过实例解析,帮助读者掌握这一强大的编程工具。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Reflection;
using ClassLibrary3;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            String AddinDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
            var AddInAssembilies = Directory.EnumerateFiles(AddinDir, "*.dll");
            
            FileStream fs = new FileStream(AddInAssembilies.Last(), FileMode.Open, FileAccess.Read);
            BinaryReader br = new BinaryReader(fs);
            byte[] bFile = br.ReadBytes((int)fs.Length);
            br.Close();
            fs.Close();
            var dll = Assembly.Load(bFile).ExportedTypes;


            foreach (Type t in dll)
            {
                IAddIN ai = (IAddIN)Activator.CreateInstance(t);
                Console.WriteLine(ai.DoSomething(3));
            }
//下面的load会报错,替换成 LoadFile(string path) 或者LoadFrom(string path)都不会有问题
            //var AddInTypes = from file in AddInAssembilies
            //             let assembly = Assembly.Load(file)
            //             from t in assembly.ExportedTypes
            //             where t.IsClass && typeof(IAddIN).GetTypeInfo().IsAssignableFrom(t.GetTypeInfo())
            //             select t;


        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ClassLibrary3
{
    public interface IAddIN { String DoSomething(Int32 x); }


}



using ClassLibrary3;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ClassLibrary4
{
    public sealed class AddIn_A : IAddIN
    {
        public AddIn_A() { }
        public string DoSomething(int x)
        {
            return $"AddIN_A: {x}";
        }
    }


    public sealed class AddIn_B : IAddIN
    {
        public AddIn_B() { }
        public string DoSomething(int x)
        {
            return $"AddIN_B: {x}";
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值