乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 153|回复: 9

反射和扩展方法

[复制链接]

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2016-1-3 14:03:49 | 显示全部楼层 |阅读模式
我试图使用反射获取在另一个程序集中定义的一些对象。如果我直接调用它,它会像这样:
parentObjectCollection。GetOtherObjects();GetOtherObjects()是一个扩展方法,但是当我使用它时。GetType()。get methods();
生成的数组缺少GetOtherObjects方法。请注意,parentObjectCollection是在AssemblyA中定义的,而扩展在AssemblyB中。我如何让反射定位这些其他的方法?

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2016-1-3 16:02:05 | 显示全部楼层
嗨,Jeff,我认为扩展方法是动态的,您需要在AssemblyB中查找方法
已接受的答案,下面链接中的以下帖子显示了一些方法:
http://stackoverflow.com/questions/299515/reflection-to-identify-extension-methods
hth
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2016-1-3 16:35:34 | 显示全部楼层
谢谢,米克!我今天早上在stackoverflow的搜索中找到了那个页面,但我想我读得不够深。我让它做我需要的事情,算是吧。它正在遍历所有程序集...我不需要,也不想让它遍历所有内容。我需要弄清楚如何让它只看具有Autodesk.Civil.DatabaseServices.Styles命名空间的程序集,但这确实给了我一个好的开始。
回复

使用道具 举报

57

主题

559

帖子

13

银币

中流砥柱

Rank: 25

铜币
786
发表于 2016-1-4 02:25:49 | 显示全部楼层
嗨,Jeff,
我相信你已经知道或弄清楚了,但我认为你必须检查该命名空间中的类型,因为命名空间成为完全限定名称的一部分。
我可能是错的,但是一旦编译,我不认为命名空间有意义或存储为元数据,但可以通过解析类型的全名来找出,或者类型类型具有命名空间属性 。
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2016-1-4 03:17:42 | 显示全部楼层

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

使用道具 举报

23

主题

239

帖子

6

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
327
发表于 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()[0],参数类型 == t。
选择方法;。
返回查询,ToArray();。
}。

回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2016-1-5 21:13:34 | 显示全部楼层
我不得不称它为别的东西。也许是



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

使用道具 举报

57

主题

559

帖子

13

银币

中流砥柱

Rank: 25

铜币
786
发表于 2016-1-5 22:13:15 | 显示全部楼层
感谢张贴您的解决方案杰夫,看起来很好,毫无疑问会派上用场!干杯。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2016-1-5 23:21:05 | 显示全部楼层

说到臃肿的代码...
回复

使用道具 举报

57

主题

559

帖子

13

银币

中流砥柱

Rank: 25

铜币
786
发表于 2016-1-6 00:10:06 | 显示全部楼层

并且不受重构影响!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-4 22:02 , Processed in 0.156093 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表