从命名空间中获取类

时间:2014-01-03 15:50:33

标签: c# dynamic .net-assembly

我正在尝试从程序集中获取类和方法,它在程序集与类所在的程序集相同时工作,但是当程序集在其他项目中时它不起作用。我已经从我想要获取类和方法的项目中添加了引用,但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();
    }

return null

enter image description here

我想要获取的类所在的组件不会出现在AppDomain.CurrentDomain.GetAssemblies()中.ToList();

enter image description here

4 个答案:

答案 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();