Jeff_M 发表于 2016-1-3 14:03:49

反射和扩展方法

我试图使用反射获取在另一个程序集中定义的一些对象。如果我直接调用它,它会像这样:
parentObjectCollection。GetOtherObjects();GetOtherObjects()是一个扩展方法,但是当我使用它时。GetType()。get methods();
生成的数组缺少GetOtherObjects方法。请注意,parentObjectCollection是在AssemblyA中定义的,而扩展在AssemblyB中。我如何让反射定位这些其他的方法?
**** Hidden Message *****

MickD 发表于 2016-1-3 16:02:05

嗨,Jeff,我认为扩展方法是动态的,您需要在AssemblyB中查找方法
已接受的答案,下面链接中的以下帖子显示了一些方法:
http://stackoverflow.com/questions/299515/reflection-to-identify-extension-methods
hth

Jeff_M 发表于 2016-1-3 16:35:34

谢谢,米克!我今天早上在stackoverflow的搜索中找到了那个页面,但我想我读得不够深。我让它做我需要的事情,算是吧。它正在遍历所有程序集...我不需要,也不想让它遍历所有内容。我需要弄清楚如何让它只看具有Autodesk.Civil.DatabaseServices.Styles命名空间的程序集,但这确实给了我一个好的开始。

kdub 发表于 2016-1-4 02:25:49

嗨,Jeff,
我相信你已经知道或弄清楚了,但我认为你必须检查该命名空间中的类型,因为命名空间成为完全限定名称的一部分。
我可能是错的,但是一旦编译,我不认为命名空间有意义或存储为元数据,但可以通过解析类型的全名来找出,或者类型类型具有命名空间属性 。

Jeff_M 发表于 2016-1-4 03:17:42


由于某种原因,我将它加入了书签
不确定它是否有帮助
请参见
类型属性

CADbloke 发表于 2016-1-5 10:35:06

感谢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();。
}。

MickD 发表于 2016-1-5 21:13:34

我不得不称它为别的东西。也许是



卡戴珊姐妹
但我很容易分心。
抱歉

kdub 发表于 2016-1-5 22:13:15

感谢张贴您的解决方案杰夫,看起来很好,毫无疑问会派上用场!干杯。

MickD 发表于 2016-1-5 23:21:05


说到臃肿的代码...

kdub 发表于 2016-1-6 00:10:06


并且不受重构影响!
页: [1]
查看完整版本: 反射和扩展方法