- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是一个打印MethodCallExpression
方法签名的简单应用程序:
using System;
using System.Linq;
using System.Linq.Expressions;
class A
{
public virtual void Foo() { }
}
class B : A
{
public override void Foo() { }
}
class C : B
{
public override void Foo() { }
}
class Program
{
static void Main(string[] args)
{
PrintMethod<A>(a => a.Foo());
PrintMethod<B>(b => b.Foo());
PrintMethod<C>(c => c.Foo());
Console.Read();
}
static void PrintMethod<T>(Expression<Action<T>> expression)
{
var body = (MethodCallExpression)expression.Body;
var method1 = body.Method;
var method2 = typeof(T).GetMethod(body.Method.Name, body.Method.GetParameters().Select(p => p.ParameterType).ToArray());
Console.WriteLine("body.Method -> " + method1.DeclaringType.ToString() + " - " + method1.ToString());
Console.WriteLine("typeof(T).GetMethod -> " + method2.DeclaringType.ToString() + " - " + method2.ToString());
}
}
我希望程序打印出来:
body.Method -> A - Void Foo()
typeof(T).GetMethod -> A - Void Foo()
body.Method -> B - Void Foo() *
typeof(T).GetMethod -> B - Void Foo()
body.Method -> C - Void Foo() *
typeof(T).GetMethod -> C - Void Foo()
但它却打印出:
body.Method -> A - Void Foo()
typeof(T).GetMethod -> A - Void Foo()
body.Method -> A - Void Foo() *
typeof(T).GetMethod -> B - Void Foo()
body.Method -> A - Void Foo() *
typeof(T).GetMethod -> C - Void Foo()
当获取继承的 MethodCallExpression
的 Method
属性时,它总是返回 A
的 MethodInfo
(根类)。
但是,在 Visual Studio 中,我在每个 Foo()
调用中“转到定义”,按预期转到每个被覆盖的方法。
为什么 MethodCallExpression.Method
会这样?规范中有关于此的内容吗?为什么 VS 和 Method
属性之间存在差异?我已经使用 .NET 4.0 和 4.5 进行了测试。
最佳答案
假设你有一个图书馆:
public class A
{
public virtual void Foo() { }
}
public class B : A
{
public override void Foo() { }
}
public class C : B
{
public override void Foo() { }
}
你有一个消费者这样做
new C().Foo();
现在更新库,使 C
不再覆盖 Foo
:
public class C : B
{
}
消费者是否需要重新编译?
如果消费者虚拟调用 C.Foo
,那么是的,消费者必须专门编写 ((A)new C()).Foo()
以避免那个问题。如果消费者虚拟调用 A.Foo
,则不会。由于这是唯一的区别,因为将在运行时调用完全相同的函数,因此消费者指定它调用 C.Foo
是没有意义的。
表达式树记录的方法信息与常规函数调用记录的方法信息相同。 C# 规范对此几乎无话可说,它由实现定义(但 Microsoft 的实现似乎并未定义(记录)它):
Conversion of an anonymous function to an expression tree type produces an expression tree (§4.6). More precisely, evaluation of the anonymous function conversion leads to the construction of an object structure that represents the structure of the anonymous function itself. The precise structure of the expression tree, as well as the exact process for creating it, are implementation defined.
关于c# - MethodCallExpression.Method 总是返回根基类的 MethodInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16419168/
假设我有这样一个类: public class MyClass { public void Foo(T t) { } } 现在,假设我有一个 MyClass 的实例和一个 Me
我有一个类类型的方法的MethodInfo,它是该类实现的接口(interface)定义的一部分。 如何检索类实现的接口(interface)类型上方法的匹配 MethodInfo 对象? 最佳答案
我的问题是:如果我有一个方法的 MethodInfo 对象,它是从一个接口(interface)类型获得的,我还有一个实现这个接口(interface)的类的 Type 对象,但是它用一个显式实现,如
获取 MethodInfo 对于 Enumerable.OfType() 我们可以使用: typeof(System.Linq.Enumerable).GetMethod("OfType", new
我正在开发一个程序,该程序根据一组输入在运行时计算表达式,然后远程执行这些表达式。这需要动态创建调用不同辅助函数的表达式。 对于静态辅助函数,可以通过使用以下方式获取 MethodInfo 实例来保证
我正在开发一个程序,该程序根据一组输入在运行时计算表达式,然后远程执行这些表达式。这需要动态创建调用不同辅助函数的表达式。 对于静态辅助函数,可以通过使用以下方式获取 MethodInfo 实例来保证
我已经为日志库创建了包装器,我想在其中记录抛出异常的外部方法的参数: public void MethodA(string param1, int param2) { try { th
有没有一种方法可以调用方法并且返回类型是强类型的? 有代码示例 public static IQueryable FilterVersion(this Table t, IVersionIndexF
我想知道 MethodInfo 是否适合用作字典键。从我非常有限的测试来看,一切似乎都很好,但是这里有什么问题吗? 有人做过吗? 最佳答案 MethodInfo 是一个抽象类,因此您的问题不能直接回答
我正在尝试使用反射调用方法。 像这样: method.Invoke(instance, propValues.ToArray()) 问题是没有办法确保参数数组的顺序正确。有没有办法通过名称指定哪些值适
类似于我之前的一个问题,当我询问获取字段的 FieldInfo 时,How to get the FieldInfo of a field from the value ,根据那里的答案,我编译了这个
我有以下方法: public TResult Call(Expression> code) { var returnValue = default(TResult); // code
我正在尝试获取 MethodInfo方法的对象: Any(IEnumerable, Func) 我遇到的问题是如何为 Func 指定类型参数有点…… MethodInfo method = typeo
我有一个定义如下的类 interface ITest { List Find(int i); } class Test: ITest { public T List Fin
我想从具有仅在运行时已知的类型参数的泛型类中获取方法的 MethodInfo。 下面是我如何从非泛型类中获取泛型方法的 MethodInfo: class MyClass { public v
我有一个 IEnumerable , 我想调用 Enumerable.Contains 反射法。我只是在努力使语法正确。这是我目前拥有的: var containsMethod = typeof(En
构造函数如下所示: public NameAndValue(string name, string value) 我需要使用反射将其作为 MethodInfo 获取。它尝试了以下操作,但没有找到构造函
我无法像我怀疑的那样获取扩展方法的方法信息。怎么了? _toStringMethod = typeof(ObjectExtensions).GetMethod("TryToString", B
这个问题在这里已经有了答案: get methodinfo from a method reference C# (7 个答案) 关闭 9 年前。 是否可以从方法符号中获取 MethodInfo 对
我的这个类型包含一个泛型方法的两个重载。我喜欢使用反射检索其中一个重载(使用 Func 参数)。然而问题是我找不到正确的参数类型来提供 Type.GetMethod(string, Type[])方法
我是一名优秀的程序员,十分优秀!