C#使用反射工厂模式遇到System.TypeLoadException

项目中,在运行另一个反射类时出现问题,未能从程序集中加载类

class PopUpActionFactory
    {
        public static InterfacePopUpAction getAction(String actionName)
        {
            InterfacePopUpAction action = null;
            actionName = "XSheet.Data.PopUpAction.PopUpAction" + actionName;
            //XNamedTable
            try
            {
                Type type = Type.GetType(actionName, true);
                action = (InterfacePopUpAction)Activator.CreateInstance(type);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
                System.Windows.Forms.MessageBox.Show("非法类型:" + actionName);
            }
            return action;
        }
    }

详细错误:

引发的异常:“System.TypeLoadException”(位于 mscorlib.dll 中)
System.TypeLoadException: 未能从程序集“XSheet, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型“XSheet.Data.PopUpAction.PopUpActionSQLUpdate”。
在 System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type)
在 System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName)
在 System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark)

问题初步排查,应该是夸程序集导致,调用Factory的代码,程序集是XSheet,而抽象工厂的程序集是XSheet.Data.PopUpAction

尝试进行测试

1.将抽象工厂提升至XSheet.Data(为了项目的简洁,不将工厂类直接提升至XSheet)

2.设置中间层,是XSheet下的代码通过中间执行类(程序集同为XSheet.Data),再调用反射工厂进行类的实例化

公司内部项目,非盈利,发布在GitHub上大家可以一起交流,促进项目进步

https://github.com/sd23152243/XSheet

新手设计,欢迎提出改进建议

时间: 2024-07-29 08:49:54

C#使用反射工厂模式遇到System.TypeLoadException的相关文章

反射,工厂模式

该类不能运行,执行Test方法,需要空构造函数 demo3: 调用指定构造方法 demo2: 调用默认构造方法 demo1: 获得.class 字节码对象,对应Class对象. 3种方法 通过反射获取成员变量,修改私有变量是可见的 通过反射的方式执行类中的方法 自动装配 工厂模式: 使用接口, 接收通过工厂类返回来的实例对象. 工厂类通过读取配置文件,来决定实例化哪个类 package com.xiaofan.test; import java.lang.reflect.Constructor;

终极版:由简单工厂模式,升级到抽象工厂模式(用到反射)

前面两个已经学习简单三层到简单工厂模式的变化,但是简单工厂模式还是有个缺点,就是简单工厂中集合了所有的实例的创建.也不是很好. 现在想到使用抽象工厂的方式来实现这个: 我们在程序集中加上下面的代码: <appSettings> <!--命名空间--> <add key="DALNameSpace" value="DAL"/> <!--程序集--> <add key="DALAssembly"

工厂模式与反射

工厂模式与反射 定义一个接口以及两个实现了该接口的类: package Reflect; interface fruit{ public void eat(); } class Apple implements fruit{ public void eat(){ System.out.println("Apple Eat"); } } class Orange implements fruit{ public void eat(){ System.out.println("O

基于C#反射机制的工厂模式

简单介绍 反射提供了描写叙述程序集.模块和类型的对象(Type 类型). 能够使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或訪问其字段和属性. 假设代码中使用了特性.能够利用反射来訪问它们. 这里的类型信息包含类型的方法,变量名称.类型等信息. 基于反射机制的工厂模式 例如以下图所看到的,游戏中经常使用的掉落物模型,Item是基类,定义了一些基础属性,也定义了一些abstract方法. Food和Weapon继承自Item.表示一类Item.再下一层的类就定

工厂模式(Factory Pattern)和java反射机制优化思考

GOF的工厂模式是最基础的一种创建型设计模式,其适用于创建同一接口的不同实现子类, 其优点是:将使使用者更加方便使用,而不关心具体的创建逻辑 缺点是:每增加一个接口的子类,必须修改工程类的相关逻辑(后面我们用java的反射机制进行优化) 从上面UML图看到,我们设置了一个Shape接口,并且实现了三个子类,我们通过ShapeFactory来根据不同的名称返回不同的子类实例,通过FactoryPatternDemo进行的测试.逻辑很简单,不再详述. public class ShapeFactor

工厂模式——抽象工厂模式(+反射)

这里又出现了一个抽象工厂模式,这个抽象工厂模式又是什么呢? 我们现在来模拟一个场景,现在用的是Mysql数据库,明天让你更换为Oracle数据库.此时,想想要做多少的改动.但我们如果用工厂模式,这会让你节省大量时间. 首先,我们用工厂方法模式来设计这个程序. 我们画出类的UML图. IFactory作为工厂类的接口,有两个子类,分别用来构造不同的实例. IFactory工厂接口代码如下: package day_3_facoryMethod_db; /** * 数据库工厂类 * @author

有关反射和简单工厂模式的简单实现

先抛出两个概念,反射机制和简单工厂模式. 一句话谈谈自己的理解 反射机制就是由参数(包名类名的字符串),获取具体类的属性方法.简单工程模式就是由一个类作公共出口来生成其他类的实例,父类子类生成模式的简单应用,可以由参数来决定具体需要的实例.往下看,是我搜到的解释,相对完善一点. 什么是反射机制? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制.上

工厂模式 ioc dom4j 反射之我的一点理解

工厂模式 //工厂模式我的理解 //第一次调用没有实例化的对象时 会去内存中查找(栈) //如果没有找到,就去xml配置中查找className和他相同的类名 //找到的话就让工厂进行实例化,初始化对象 //没找到的话就空指针异常 公产模式就是ioc(inversion of control) 和hibernate的控制反转有点像  就是把自身不维护关系,交给别人来维护关系 dao层,service层在编码时只声明对象,而把实例化对象的权利交给工厂,工厂通过配置文件来配置类(对象)的信息, 然后

JAVA的反射和工厂模式的例子实现

一.JAVA的反射 在学习反射的时候就没太弄明白,现在看了一些资料认真学习一下,暂时记录此刻的笔记. 1.java反射的概念: 就是java程序运行时才确定哪个类被加载了,编译器不知道该加载哪个类.这种特点就是反射.反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 其实我们的本地IDE就是使用了这种机制,当我们敲入某个类名然后按下.点号的时候,自