我正在尝试从程序集中获取类和方法,它在程序集与类所在的程序集相同时工作,但是当程序集在其他项目中时它不起作用。我已经从我想要获取类和方法的项目中添加了引用,但var theList返回null。我想从一个proyect到另一个proyect获得类和方法,2个proyects在同一个解决方案中。我需要一些帮助
class Program
{
static void Main(string[] args)
{
var theList = Assembly.GetExecutingAssembly().GetTypes().ToList().Where(t => t.Namespace == "____mvc4.Models").ToList();
Console.WriteLine("--List of Classes with his respective namescpace : ");
foreach (var item in theList)
{
Console.WriteLine(item);
}
Console.WriteLine("------List of classes: ");
foreach (var item in theList)
{
Console.WriteLine("*****************" + item.Name + "*****************");
MemberInfo[] memberInfo = item.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.Instance);
for (int i = 0; i < memberInfo.Length; i++)
{
if (!(memberInfo[i].Name.Contains("get_") || memberInfo[i].Name.Contains("set_")))
{
Console.WriteLine("{0}", memberInfo[i].Name);
}
}
}
Console.ReadLine();
}
我想要获取的类所在的组件不会出现在AppDomain.CurrentDomain.GetAssemblies()中.ToList();
答案 0 :(得分:1)
下面...
var theList = Assembly.GetExecutingAssembly().GetTypes()...etc
您指的是当前(“正在执行”)程序集。如果要从其他程序集获取类型,则需要获取对该程序集的引用。一种简单的方法是从引用的程序集中引用某种类型的:
var otherAssembly = typeof(SomeTypeDefinedInAReferencedAssembly).Assembly;
var theList = otherAssembly.GetTypes()...etc
答案 1 :(得分:1)
如果您尝试尽可能地执行此操作,而不知道或关心哪些程序集包含此命名空间,则需要检查已加载的模块:
var theList = new List<Type>();
BuildManager.GetReferencedAssemblies();
var modules = Assembly.GetExecutingAssembly().GetLoadedModules();
theList.AddRange(modules.SelectMany(x => x.Assembly.GetTypes().Where(t => t.Namespace == "____mvc4.Models")));
答案 2 :(得分:1)
如果要动态执行,则需要获取当前域中的所有程序集或迭代/ bin /目录。该域名将为您提供各种程序集,包括标准程序集,如System
。 / bin /会限制您只使用自定义内容。
这是我使用的实用方法。您传递了评估 - 即过滤器 - 然后它会返回一个类型列表。
public static List<Type> GetClassesWhere(Func<Type, bool> evaluator)
{
var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
var types = new List<Type>();
foreach(var assembly in assemblies)
{
try
{
types.AddRange(assembly.GetTypes().Where(evaluator).ToList());
}
catch
{
}
}
return types;
}
我尝试/单独捕获每个程序集,因为我发现有时候我会得到一些奇怪的权限拒绝错误,尤其是在Azure和AppHarbor等共享环境中。总是在我不关心的集会上,所以这就是为什么我对捕获没有采取任何行动。对于我的自定义程序集,它总是适用于我。
在您的示例中,您将使用它(假设您将其放在名为Utilities
的静态类中)
var types = Utilities.GetClassesWhere(t => t.Namespace == "____mvc4.Models");
答案 3 :(得分:-2)
AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(am => am.GetTypes())
.Select(a => a.Namespace == "Name of your namespace")
.Distinct();