Tag: methodinfo

获取Enumerable.DefaultIfEmpty的methodinfo

我正在构建一些Linq Expression并试图获取IEnumerable.DefaultIfEmpty ( http://msdn.microsoft.com/en-us/library/bb360179.aspx )的MethodInfo。 什么似乎是一件容易的事,但我对它为什么不起作用毫无头绪。 typeof(Enumerable).GetMethod(“DefaultIfEmpty”, new[] { typeof(IEnumerable) }); typeof(Enumerable).GetMethod(“DefaultIfEmpty”, new[] { typeof(IEnumerable).MakeGenericType(typeof(WorkitemListModel)) });

询问MethodInfo需要多少参数的最有效方法是什么?

如果MethodInfo接受参数,那么询问MethodInfo的最有效方法是什么?如果接受,有多少? 我目前的解决方案是: methodInfo.GetParameters().Any()和methodInfo.GetParameters().Count() 。 这是最有效的方式吗? 由于我实际上并不需要任何ParameterInfo对象,有没有办法在不调用GetParameters()情况下执行此操作?

Lambda表达式<T,Func >和MethodInfo

在将项目从VS2010迁移到VS2012时,我遇到了以下问题。 该项目使用了很多reflection,为了从接口获取MethodInfo,放置了以下代码: Expression<Func<ITest, Func>> expression = scv => scv.Get; UnaryExpression unaryExpression = expression.Body as UnaryExpression; MethodCallExpression methodCallExpression = unaryExpression.Operand as MethodCallExpression; ConstantExpression constantExpression = methodCallExpression.Arguments[2] as ConstantExpression; MethodInfo myMethod = constantExpression.Value as MethodInfo; 使用VS2010编译时效果很好,但是如果使用针对.Net 4.0的VS2012编译代码,则methodCallExpression.Arguments.Count()为2。 反编译后,我注意到编译器为同一个表达式生成了不同的代码。 这是一个设计问题,因为设计不应该像methodCallExpression.Arguments [2]中的数字2那样继续传递“幻数”。 我尝试使用以下方法找到解决方案: MethodCallExpression outermostExpression = expression .Body as MethodCallExpression; MethodInfo myMethod = outermostExpression.Method; 但是outermostExpression为null。 最后,我让它改变了表达式如下: Expression<Func> expression = […]

根据c#中的用户输入解析为原始类型

我这样做的代码使用我给它的reflection和字符串,而不是用户输入。 最终我希望用户能够说“浮动”“2.0”并让计算机说,是的,这是一个浮动,或计算机会说的“bool”“abc”,这是没有听说过的布尔值。 获取用户输入并将其转换为基本类型名称是很简单的,例如“string”到“System.String”,“float”到“System.Single”等等(尽管如果你知道一个函数要做到这一点,那也会很棒。) 这是代码: Console.WriteLine(“1.0 => {0}”, System.Single.Parse(“1.0”)); // this works fine. Type t = Type.GetType(“System.Single”); // for parsing floats MethodInfo mi = t.GetMethod(“System.Single.Parse”); // “ambiguous” if use “Parse” object[] parameters = new object[] { “1.0” }; float f = (float)(mi.Invoke(null, parameters)); // get null exception here. Console.WriteLine(“Was succesfully parsed to: ” + f); 但是我在第二行到最后一行继续得到一个空例外。 […]

为什么VS2010总是在MethodInfo.Invoke的exception中断?

我有一个关于MethodInfo.Invoke(o,null)的try / catch,并且VS2010被设置为永远不会在Exceptions上中断,但不幸的是调试器继续在Invoked方法内部中断。 该方法是静态的,我已经安装了Phone Developer Beta。 这是错误还是开发人员错误? 谢谢!!

如何用reflection读取方法体

是否有可能找到有关reflection的Method主体的任何信息? 怎么样?

pt 2,无法捕捉的例外

更新:我已经在Microsoft Connect上提交了错误报告: https : //connect.microsoft.com/VisualStudio/feedback/details/568271/debugger-halting-on-exception-thrown-inside-methodinfo-invoke#details 如果您可以在您的计算机上重现此问题,请提供该错误以便修复它! 好的,我已经做了一些测试,我把问题简化为非常简单的事情: 一世。 在抛出exception的新类中创建方法: public class Class1 { public void CallMe() { string blah = null; blah.ToLower(); } } II。 创建一个MethodInfo,在其他地方指向此方法: Type class1 = typeof( Class1 ); Class1 obj = new Class1(); MethodInfo method = class1.GetMethod( “CallMe” ); III。 在try / catch块中包含对Invoke()的调用: try { method.Invoke( obj, null ); // exception […]

遍历ac#方法和anazlye方法体

什么是在c#中遍历methodinfo的最简单方法? 我想遍历方法体并查找字段引用等,并检索类型。 在System.Reflection中有: mi.GetMethodBody().GetILAsByteArray() 这是一种低级别,在我能够穿越身体之前需要“一些”工作。 我知道Cecil存在,但在使用cecil加载内存程序集时出现问题。 我正在使用的程序集并不总是“在磁盘上”它可以是从例如编译的内存程序集中。 嘘,我不是一个干净的解决方案, 而无需将程序集临时写入磁盘。 还有什么其他选择呢?

使用reflection检查方法是否为“扩展方法”

作为我的应用程序的一部分,我有一个接收MethodInfo并需要对其执行特定操作的函数,具体取决于该方法是否为“扩展方法”。 我检查了MethodInfo类,我找不到任何显示该方法是扩展名的IsExtension属性或标志。 有谁知道如何从方法的MethodInfo中找到它?

如何确定MethodInfo是否是基本方法的覆盖

我试图确定我从类型实例上的GetMethod调用获得的MethodInfo对象是由类型还是由它的基类实现的。 例如: Foo foo = new Foo(); MethodInfo methodInfo = foo.GetType().GetMethod(“ToString”,BindingFlags|Instance); ToString方法可以在Foo类中实现。 我想知道我是否得到了foo实现? 相关问题 是否可以判断派生类中是否已覆盖.NET虚方法?