什么是获取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的源代码,则找到 需要的所有程序集作为引用。
答案 0 :(得分:0)
您要求的内容与C#语言的工作方式不符。
据我了解,无法看到令牌Byte
,并且明确地知道来自System.Byte
的来电者意为mscorlib
。它们可能意味着他们自己的Byte
实现来自他们自己的命名空间,甚至可以从他们自己的命名空间中实现System.Byte
实现。
这就是为什么作为应用程序开发人员,您需要指明要引用的库,然后删除任何不明确的引用。
如果要查看类型接口所需的类型,可以使用反射来迭代该类型的所有公共(和受保护)成员,并查看它们接受哪些类型作为参数并返回。
您还必须查看所有引用类型的基本类型和接口,它们也可以在单独的程序集中声明。
每个Type
实例都公开一个Assembly
属性,您可以使用该属性来定位加载该类型的AppDomain找到类型的程序集。这可能足以满足您的目的。