- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我遇到了一个我没想到的问题。一个例子可能比一段话更能说明我的问题:
更新:跳到最后一个代码块以获得更 Eloquent 代码示例。
public class A
{
public string B { get; set; }
}
public class C : A { }
下面是一个方法的一些代码:
var a = typeof(C).GetMember("B")[0];
var b = typeof(A).GetMember("B")[0];
Expression<Func<C, string>> c = x => x.B;
var d = (c.Body as MemberExpression).Member;
下面是一些比较的结果:
a == b //false
a == d //false
b == d //true
前两个有点出乎意料。我知道即使 B 不是虚拟的,C 也可以用 new
运算符定义一个同名的属性,但在这种情况下我没有。
第二个对我来说确实是最令人惊讶的(也是我问题的核心)。即使 lambda 的参数被明确定义为 C 类型,它仍然返回它,就好像该属性是从基类访问的一样。
我正在寻找的是一种从 lambda 表达式中获取 MemberInfo 的方法,就像我对参数类型使用反射来获取 MemberInfo 一样。我的项目基本上将 MemberInfos 存储在各种字典中,它需要具有可以通过提供 lambda 表达式访问元素的功能。
Danny Chen 重述的代码示例
public class Base
{
public string Name { get; set; }
}
public class Derived : Base { }
//in Main
var parentMember = typeof(Base).GetMember("Name")[0];
var childMember = typeof(Derived).GetMember("Name")[0];
Expression<Func<Base, string>> parentExp = x => x.Name;
var parentExpMember = (parentExp.Body as MemberExpression).Member;
Expression<Func<Derived, string>> childExp = x => x.Name;
var childExpMember = (childExp.Body as MemberExpression).Member;
parentMember == childMember //false, good
parentMember == parentExpMember //true, good
childMember == childExpMember //false, why?
最佳答案
获取表达式的(第一个)参数的类型,然后说
Expression<Func<C, string>> c = x => x.B;
Type paramType = c.Parameters[0].Type; // first parameter of expression
var d = paramType.GetMember((c.Body as MemberExpression).Member.Name)[0];
关于c# - Lambda 表达式未返回预期的 MemberInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6658669/
我知道 BindingFlags 用于从类型中获取公共(public)和非公共(public)成员。 但是有没有办法确定 MemberInfo 实例(或派生的 PropertyInfo、MethodI
我正在编写一个使用反射来验证特定代码库的代码分析工具。当我遇到感兴趣的类型或成员时,我想加载符号并提取定义成员或类型的源文件和行号。这可能吗?如果是,怎么办? class SourceInfo {
我注意到在类 MemberInfo 的包 System.Reflection 中有两种方法(一种类方法和一种扩展方法)具有相同的签名但返回类型不同: 类方法: public abstract obje
在我们的应用程序中,我们需要一种方法来唯一标识 C# 中的反射元数据对象。反射 API 有一个 MemberInfo.MetadataToken 属性,它被记录为完成这个任务。但是,没有记录的是,如果
给定以下代码: public class Base { public virtual void Method() { } } public class Derived : Base {
如何获取实例成员的值? 对于 propertyInfos,有一个 propertyInfo.GetValue(instance, index),但在 memberInfo 中不存在这样的东西。 我在网
假设我有以下代码。如何通过反射获取 MemberInfo/PropertyInfo 以“显式”实现 Test.Name? 此外,有没有什么方法可以通过编程知道 MemberInfo 是接口(inter
我已经搜索了一段时间,但没有找到解决方案。我在 GAC 中有一个程序集。我必须使用反射加载它。之后,我需要获取 Enum 并对其进行寻址。但是我只能得到 MemberInfo[]。我不明白如何将 Me
我遇到了一个我没想到的问题。一个例子可能比一段话更能说明我的问题: 更新:跳到最后一个代码块以获得更 Eloquent 代码示例。 public class A { public string B
我正在使用反射加载具有项目类结构的 TreeView 。类中的每个成员都分配有自定义属性。 我在使用 MemberInfo.GetCustomAttributes() 获取类的属性时没有问题,但是我需
如何获取 MemberInfo 对象的值? .Name 返回变量的名称,但我需要值。 我想你可以用 FieldInfo 做到这一点,但我没有代码片段,如果你知道如何做到这一点,你能提供一个代码片段吗?
UnaryExpression 有一些问题。 这是可行的: Expression, object>> k = l => l.Count; //got member in this case like
我正在编写一个扩展以从 Enum 中获取描述和其他属性。我见过使用 FieldInfo 的示例和其他使用 MemberInfo 的示例。谁能解释一下有什么区别,什么时候我应该使用哪一个会有所不同? 最
public enum Animal { [Description("King of jungle")] Lion= 1, [Description("Tallest ther
我的项目引用类型为 SomeType 的 TypesDefinitionAssembly,它由 XSerializationLibrary 和 中的属性 XSerializationOptions 标
这个问题在这里已经有了答案: Why is there not a `fieldof` or `methodof` operator in C#? [closed] (4 个答案) 关闭 9 年前。
Resharper 告诉我 MemberInfo.DeclaringType 永远不能为空: 但是,当该代码运行时,会打印文本“Top level member”。我不明白,这里有什么问题? 最佳答案
我正在使用反射并遇到错误: System.Reflection.TargetException: Object does not match target type 因为我认为Type.GetMemb
我的问题涉及检查属性的继承属性。 如 this Question 中所述方法 Attribute.IsDefined(MemberInfo, Type, Boolean) (1) 和 MemberIn
我需要查看 MemberInfo 是否与特定的 BindingFlags 匹配。与此最接近的方法是 Type#GetMember(string, BindingFlags)。 我找不到任何方法来做到这
我是一名优秀的程序员,十分优秀!