我想要哪个组件?

时间:2011-01-02 00:20:08

标签: c# reflection

我正在编写一个Web框架,我正在实现一些自定义属性。我希望得到所有这些属性,以便我可以用它们做些什么。我想这样做,我首先需要获得程序集,然后我可以获得其中定义的所有类型(类),从那里我可以得到它的所有方法,最后是属性。

所以,我在看Assembly.Get___Assembly。我想使用呼叫,录入还是执行?这个webframework将被编译到它自己的程序集DLL中,然后使用该框架的人应该包含该DLL并使用来自Web框架程序集的属性实现它们自己的类。

所以......我以为Executing会给我一个web框架DLL,因为那是属性处理代码的地方,而不是属性的使用位置,所以这不是我想要的。

EntryAssembly听起来很有希望......但这是在IIS上运行....所以它会返回什么?

CallingAssembly听起来不对......我想要哪个?


目前,我尚未将web框架分离到自己的程序集中,因此我在一个程序集中同时构建Web应用程序和Web框架。

所以ExecutingAssembly确实有效(暂时),但我担心当我把它分开时会给我错误的。

无论出于何种原因,

CallingAssembly都会System.WebEntryAssembly为空。

3 个答案:

答案 0 :(得分:2)

如果使用此属性修饰的所有元素与调用代码位于同一个程序集中,则可以使用this.GetType().Assembly(或typeof(CurrentType).Assembly作为静态)。

另一种常见情况是获取应用程序中所有属性修饰的元素而不管汇编,这可以通过AppDomain.CurrentDomain.GetAssemblies()轻松完成。

答案 1 :(得分:1)

我认为这里最安全的选择是让框架的用户指定他们想要的程序集:

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

(在您的框架中定义SomeClass

答案 2 :(得分:0)

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

*剪断*

新版本:

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);
}