反射和扩展方法
我试图使用反射获取在另一个程序集中定义的一些对象。如果我直接调用它,它会像这样:parentObjectCollection。GetOtherObjects();GetOtherObjects()是一个扩展方法,但是当我使用它时。GetType()。get methods();
生成的数组缺少GetOtherObjects方法。请注意,parentObjectCollection是在AssemblyA中定义的,而扩展在AssemblyB中。我如何让反射定位这些其他的方法?
**** Hidden Message ***** 嗨,Jeff,我认为扩展方法是动态的,您需要在AssemblyB中查找方法
已接受的答案,下面链接中的以下帖子显示了一些方法:
http://stackoverflow.com/questions/299515/reflection-to-identify-extension-methods
hth 谢谢,米克!我今天早上在stackoverflow的搜索中找到了那个页面,但我想我读得不够深。我让它做我需要的事情,算是吧。它正在遍历所有程序集...我不需要,也不想让它遍历所有内容。我需要弄清楚如何让它只看具有Autodesk.Civil.DatabaseServices.Styles命名空间的程序集,但这确实给了我一个好的开始。 嗨,Jeff,
我相信你已经知道或弄清楚了,但我认为你必须检查该命名空间中的类型,因为命名空间成为完全限定名称的一部分。
我可能是错的,但是一旦编译,我不认为命名空间有意义或存储为元数据,但可以通过解析类型的全名来找出,或者类型类型具有命名空间属性 。
由于某种原因,我将它加入了书签
不确定它是否有帮助
请参见
类型属性 感谢Mick, Jeff, & Kerry。一旦我有了更多的时间玩,我发现我可以根据我知道的扩展方法将位于的名称来筛选程序集。现在,这完全符合我的需求。以下是我如何修改Mick链接中提供的代码: /// 。
此方法扩展 System.Type 类型以获取所有扩展方法,它特此在当前 AppDomain 已知的所有程序集中进行搜索,。
/// 。
/// 。
/// 灵感来自沃尔夫冈·斯泰尔兹哈默(Wolfgang Stelzhammer)对 http://stackoverflow.com/questions/299515/c-sharp-reflection-to-identify-extension-methods。
/// 。
/// 返回带有扩展方法的方法信息 []。
。
公共静态方法Info[] GetExtensionMethods(此类型 t,字符串名称)。
{。
List AssTypes = new List();。
var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(m=>m.FullName.ToUpper().包含(名称,ToUpper()));。
foreach(程序集中的程序集项)。
{。
尝试。
{。
AssTypes.AddRange(item.GetTypes());。
}。
捕获 { }。
}。
。
var query = from type in AssTypes。
其中键入,IsSealed && !type.IsGenericType && !type.IsNested。
从类型中的方法,GetMethods(BindingFlags.Static |BindingFlags.Public |BindingFlags.NonPublic)。
其中方法,IsDefined(typeof(ExtensionAttribute), false)。
其中方法,GetParameters(),参数类型 == t。
选择方法;。
返回查询,ToArray();。
}。
。
我不得不称它为别的东西。也许是
卡戴珊姐妹
但我很容易分心。
抱歉 感谢张贴您的解决方案杰夫,看起来很好,毫无疑问会派上用场!干杯。
说到臃肿的代码...
并且不受重构影响!
页:
[1]