具有项目引用关系的反射如何实现

享受编程乐趣 2015-05-18 01:14:13
项目A中:
有类: Class_A1,Class_A2,
接口: Interface_A1
Class_A1中有两个属性:
public string className{get;private set;} //存储需要反射的类名("Class_B1"、"Class_B2"等)
public Interface_A1 myInterface{get;private set;} //存储通过className反射后的类的实例

Interface_A1中定义了一个方法:
Calss_A2 Func(List<Class_A2> para);

项目B中:
有类: Class_B1,Class_B2,Class_B3,Class_B4,
项目B引用了项目A,且Class_B1,Class_B2,Class_B3,Class_B4均实现了Interface_A1接口(的Func方法)
----------------------------------------------------------分割线----------------------------------------------------------
请问,运行的时候,使用反射为项目A中的Class_A1中的myInterface赋值需要怎么做呀?
我现在只会从么有这样的引用关系的项目生成的DLL中反射。
我也考虑过将Class_A2单独提取出来成为一个项目(比如项目C),这样就项目B就只需要引用项目C即可,然后项目A也引用项目C,为Class_A1中的myInterface赋值时直接加载项目B生成的DLL,然后反射即可,但是最好不分离一个项目C出来,否则,我还要跟人家商量改动(可能会同意改动,不好说).
人家的要求(不能更改)分离出来就是:在项目A中使用反射得到项目B中的类。
注:人家提要求的时候没考虑到具体实现,项目B中的类部分依赖于项目A,需要引用项目A,为了避免循环引用,项目B肯定是不能引用项目A的。
希望大家能提供一个建议,我该怎么解决?可以只提供明确思路而没有代码,当然如果有代码更好,先行谢过。
...全文
198 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
享受编程乐趣 2015-05-18
  • 打赏
  • 举报
回复
#7的结尾处,缺少两个字(完善了一下),应该是“通过反射加载出ReflectTest,获取到它的实例(怎么转化为ReflectTest类型,或者ITest类型),然后赋值给myTest”
享受编程乐趣 2015-05-18
  • 打赏
  • 举报
回复
我的问题问的不算好,就算了吧,我有以下问题: 假设我有一个项目Project2,里面定义了一个接口:

namespace Project2
{
	public interface ITest:
	{
		bool IsEven(int num);
	}
}
--------------------------------------------分割线---------------------------------------------------------- 现在我有一个类,是在项目Project1中的(会生成Project1.DLL),Project1引用了Project2,实现了ITest接口,定义如下:

namespace Project1
{
	public class ReflectTest:ITest
	{
		public ReflectTest()
		{
			Console.WriteLine("无参构造");
		}
		
		public ReflectTest(object para)
		{
			Console.WriteLine("有参构造");
		}
		
		public bool IsEven(int num)
		{
			return num%2==0;
		}
	}
}
--------------------------------------------分割线---------------------------------------------------------- 我写了如下的帮助类,专门通过反射来加载某个类,并调用方法:

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

using System.IO;
using System.Reflection;

namespace CommonLibrary
{
    /// <summary>
    /// DLL反射加载类
    /// </summary>
    public class DLLReflect
    {
        private Assembly assembly;
        private Type type;
        private string strClass;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="dllFile">DLL文件路径(必须为完整的绝对路径)</param>
        /// <param name="nameSpace">命名空间</param>
        /// <param name="className">类名</param>
        public DLLReflect(string dllFile, string nameSpace, string className)
        {
            if (File.Exists(dllFile) == false)
            {
                throw new FileNotFoundException("文件不存在", dllFile);
            }
            else
            {
                assembly = Assembly.LoadFile(dllFile);
                strClass = string.Format("{0}.{1}", nameSpace, className);
                type = assembly.GetType(strClass, true, true);
            }
        }

        /// <summary>
        /// 调用实例方法
        /// </summary>
        /// <param name="methodName">方法名</param>
        /// <param name="paras">参数</param>
        /// <returns></returns>
        public object InstanceInvoke(string methodName, params object[] paras)
        {
            MethodInfo method = type.GetMethod(methodName);
            object obj = assembly.CreateInstance(strClass, true);
            return method.Invoke(obj, paras);
        }

        /// <summary>
        /// 调用静态方法
        /// </summary>
        /// <param name="methodName">方法名</param>
        /// <param name="paras">方法参数</param>
        /// <returns></returns>
        public object StaticInvoke(string methodName, params object[] paras)
        {
            MethodInfo method = type.GetMethod(methodName);
            return method.Invoke(null, paras);
        }
    }
}
--------------------------------------------分割线---------------------------------------------------------- 现在在Project2中,我想通过反射的方式得到Project1中的ReflectTest类的实例, 比如在Project2中的某类中有
public ITest myTest;
那么我想通过反射加载出ReflectTest,获取到它的,然后赋值给myTest,可以实现吗? 如果可以,需要怎么写呀?这个还真的需要代码,实在是在想不出来! 如果不可以,还请明示为什么?
享受编程乐趣 2015-05-18
  • 打赏
  • 举报
回复
抱歉,#2处回复时太过匆忙,没注意写错了,才发现。 是项目B引用了项目A,项目A在运行的时候,需要通过反射调用项目B中的功能
Poopaye 2015-05-18
  • 打赏
  • 举报
回复
引用 2 楼 gsw945 的回复:
项目A是一个核心项目,一旦做好以后,很少修改,可能有改动的是项目B, 但是项目A中有部分基础的代码能为项目B所用,所以项目B引用了项目A, 而项目A 虽然很少改动,但是在实际运行的时候需要调用项目A中的功能,所以项目A需要采用反射的方式调用项目A
A调A干嘛还要反射?
  • 打赏
  • 举报
回复
Assembly.LoadFrom("").CreateInstance
反射就这么一回事啊
  • 打赏
  • 举报
回复
项目A需要采用反射的方式调用项目A……这是自己调用自己吗?
享受编程乐趣 2015-05-18
  • 打赏
  • 举报
回复
项目A是一个核心项目,一旦做好以后,很少修改,可能有改动的是项目B, 但是项目A中有部分基础的代码能为项目B所用,所以项目B引用了项目A, 而项目A 虽然很少改动,但是在实际运行的时候需要调用项目A中的功能,所以项目A需要采用反射的方式调用项目A
Poopaye 2015-05-18
  • 打赏
  • 举报
回复
不清楚你具体的需求是怎样的 但既然是B引用A,那就是由B来调用A的代码咯 为什么不在A里直接提供一个接口接收Interface_A1的实例?

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧