查找Type的实现所需的所有程序集以便成功编译

时间:2013-11-25 12:36:28

标签: c# .net reflection code-generation codedom

什么是获取Type的实现(.cs源文件)成功编译所需的所有程序集的Reflection方法?

假设您的源文件仅包含此类型的实现(没有其他实现)。

例如

程序集MyAssembly.dll声明此接口

public interface IInterface { byte[] Array { get; } }

程序集MyAssembly2.dll声明了这个抽象类

public abstract class MyTypeBase: IInterface
{
   public byte[] Array { get; set; }
   protected virtual void Execute(ConfigurationManager cmgr) { }
}

在源文件“MyType.cs”中有MyType

的实现
public class MyType<T>: MyTypeBase
{
   protected override void Execute(ConfigurationManager cmgr)
   {
        Array = new Byte[512];
   }

   public List<T> Data { get; set; }
}

然后,对于类型MyType<DateTime>,引用所需的程序集将是:

  • mscorlib(由于DateTime, Byte, Byte[], List<DateTime>
  • MyAssembly2.dll(由于MyTypeBase
  • MyAssembly.dll(因IInterface间接引用的MyTypeBase
  • System.Configuration(由于ConfigurationManager

这将用于动态编译场景,我不知道有多深,我需要查找某种类型引用的类型(该类型的已实现接口,继承类,返回类型,方法)参数,事件等)

例如,上述示例是否有必要引用MyAssembly.dll,因为它是间接引用的而不是MyType<DateTime>直接引用的?

更新

正如我所说,这将在动态编译场景中使用,但我忘了提到没有要编译的源文件,而是CodeDOM CompilationUnit。因此,初始Type中的每个引用类型都是众所周知的(通过反射)。

我想要的是,对于运行时给定的Type实例,如果必须编译此Type的源代码,则找到 需要的所有程序集作为引用。

1 个答案:

答案 0 :(得分:0)

您要求的内容与C#语言的工作方式不符。

据我了解,无法看到令牌Byte,并且明确地知道来自System.Byte的来电者意为mscorlib。它们可能意味着他们自己的Byte实现来自他们自己的命名空间,甚至可以从他们自己的命名空间中实现System.Byte实现。

这就是为什么作为应用程序开发人员,您需要指明要引用的库,然后删除任何不明确的引用。


如果要查看类型接口所需的类型,可以使用反射来迭代该类型的所有公共(和受保护)成员,并查看它们接受哪些类型作为参数并返回。

您还必须查看所有引用类型的基本类型和接口,它们也可以在单独的程序集中声明。

每个Type实例都公开一个Assembly属性,您可以使用该属性来定位加载该类型的AppDomain找到类型的程序集。这可能足以满足您的目的。