我正在编写一个Web框架,我正在实现一些自定义属性。我希望得到所有这些属性,以便我可以用它们做些什么。我想这样做,我首先需要获得程序集,然后我可以获得其中定义的所有类型(类),从那里我可以得到它的所有方法,最后是属性。
所以,我在看Assembly.Get___Assembly
。我想使用呼叫,录入还是执行?这个webframework将被编译到它自己的程序集DLL中,然后使用该框架的人应该包含该DLL并使用来自Web框架程序集的属性实现它们自己的类。
所以......我以为Executing会给我一个web框架DLL,因为那是属性处理代码的地方,而不是属性的使用位置,所以这不是我想要的。
EntryAssembly听起来很有希望......但这是在IIS上运行....所以它会返回什么?
CallingAssembly听起来不对......我想要哪个?
目前,我尚未将web框架分离到自己的程序集中,因此我在一个程序集中同时构建Web应用程序和Web框架。
所以ExecutingAssembly
确实有效(暂时),但我担心当我把它分开时会给我错误的。
CallingAssembly
都会System.Web
,EntryAssembly
为空。
答案 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);
}