繁体   English   中英

我要哪个程序集?

[英]Which assembly do I want?

我正在编写一个Web框架,并且正在实现一些自定义属性。 我想获取所有这些属性,以便可以对它们进行处理。 我想这样做,我首先需要获取程序集,然后可以获取其中定义的所有类型(类),然后可以获取其所有方法,最后是属性。

所以,我在看Assembly.Get___Assembly 我要使用呼叫,输入还是执行? 该网络框架将被编译成其自己的程序集DLL,然后使用该框架的人员应包括该DLL,并使用来自Web框架程序集的属性来实现自己的类。

所以...我当时想执行将给我Web框架DLL,因为那是属性处理代码所在的位置,而不是属性使用的位置,所以那不是我想要的。

EntryAssembly听起来很有希望...但是它正在IIS上运行...。那么它将返回什么?

而且CallingAssembly听起来很不对劲...那我要哪个呢?


目前,我还没有将webframework分成自己的程序集,所以我有点想在一个程序集中同时构建一个web应用程序和一个web框架。

因此, ExecutingAssembly确实可以正常工作(暂时),但恐怕将其分离出来会给我错误的提示。

无论出于何种原因, EntryAssembly CallingAssembly给出System.Web ,而EntryAssembly为null。

如果用此属性修饰的所有元素都与调用代码在同一程序this.GetType().Assembly ,则可以仅使用this.GetType().Assembly (或typeof(CurrentType).Assembly for typeof(CurrentType).Assembly )。

另一种常见情况是获取应用程序中所有属性装饰的元素,而无需考虑程序集,这可以通过AppDomain.CurrentDomain.GetAssemblies()轻松完成。

我认为这里最安全的选择是让框架的用户指定所需的程序集:

SomeClass.RegisterAssembly(this.GetType().Assembly);

(其中在您的框架中定义了SomeClass

这是我最终用来获取所有属性的代码:

*剪断*

新版本:

private static IEnumerable<Route> GetInlineRoutes()
{
    var methods = AppDomain.CurrentDomain.GetAssemblies()
        .SelectMany(a =>
            a.GetTypes()
                .Where(t => t.IsClass && t.IsSubclassOf(typeof (Controller))))
        .SelectMany(c => c.GetMethods(BindingFlags.Public | BindingFlags.Instance));

    return from method in methods
        let urlAttributes = method.GetCustomAttributes(true).OfType<UrlAttribute>()
        from attr in urlAttributes
        select new Route(attr.Pattern, method, attr.Priority);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM