- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找一种解决方案来访问类的“展平”(最低)属性值及其通过属性名称的反射派生的值。
即从 ClassB 或 ClassC 类型访问 Property1 或 Property2 :
public class ClassA
{
public virtual object Property1 { get; set; }
public object Property2 { get; set; }
}
public class ClassB : ClassA
{
public override object Property1 { get; set; }
}
public class ClassC : ClassB
{
}
在您拥有被覆盖的虚拟属性(即ClassB 中的Property1)之前,使用简单反射一直有效。然后你会得到一个 AmbiguousMatchException 因为搜索者不知道你是想要主类的属性还是派生类。
使用 BindingFlags.DeclaredOnly 避免 AmbiguousMatchException 但未覆盖的虚拟属性或派生类属性被省略(即 Property2 来自 ClassB)。
对于这个糟糕的解决方法是否有替代方案:
// Get the main class property with the specified propertyName
PropertyInfo propertyInfo = _type.GetProperty(propertyName, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
// If not found, get the property wherever it is
if (propertyInfo == null)
propertyInfo = _type.GetProperty(propertyName);
此外,此解决方法无法解决二级属性的反射:从 ClassC 获取 Property1 并且 AmbiguousMatchException 又回来了。
我的想法:我别无选择,只能循环... Erk ... ??
我对 Emit、Lambda(Expression.Call 可以处理这个吗?)甚至 DLR 解决方案持开放态度。
谢谢!
最佳答案
执行此操作的唯一方法是枚举所有属性并过滤掉重复项。
我建议使用像 Fasterflect 这样的库去做这个。它解决了难题,并为您提供了大量优于标准反射的出色功能。
// find properties and remove duplicates higher up the hierarchy
var properties = type.Properties( Flags.ExcludeBackingMembers );
关于c# - BindingFlags.DeclaredOnly 替代方法以避免派生类的属性不明确 (AmbiguousMatchException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2720544/
我写了这段代码: MethodInfo method2 = typeof(IntPtr).GetMethod( "op_Explicit", Bind
using System; using System.Reflection; namespace A { interface IObjectWithId { TId Id { get;
我得到异常(exception): AmbiguousMatchException: ambiguous match found 当打开我的窗口时,XAML被解析。我有一个基本的ViewModel类。
我有以下(简化的)类(class): public abstract class BaseSite { public int SiteId { get; set; } public s
我正在尝试在我的代码重载签名中测试(使用 Moq)重载 protected 泛型方法: protected void AutoMap(IList sources
我正在寻找一种解决方案来访问类的“展平”(最低)属性值及其通过属性名称的反射派生的值。 即从 ClassB 或 ClassC 类型访问 Property1 或 Property2 : publi
我有两个名称相同但方法签名不同的 Controller 操作。它们看起来像这样: // // GET: /Stationery/5?asHtml=true [AcceptVer
我正在使用反射创建一个 lambda 函数。它适用于我尝试过的大多数项目,但是在其中一个属性上它一直抛出不明确的匹配异常。 代码如下所示。当它命中 Expression.PropertyOrField
我有两个名称相同但大小写不同的属性 Title 和 TITLE: public class Product { [Key] public Guid Id { get; set; }
昨天我在开发 Web 部件时遇到了一个问题(这个问题不是关于 webpart 而是关于 C#)。关于这个问题的背景很少。我有一个使用反射加载 WebPart 的代码,其中我得到了 AmbiguousM
当我使用 JSON.NET 在 LINQPad 中运行此代码时: var x = JObject.Parse( @"{ ""data"" : [ { ""id"" : ""bbab529e
我正在尝试获取 MethodInfo来自方法 TableExists所以我可以用一个类型来调用它。 该方法在 OrmLiteSchemaApi 中声明类(class)。有2个重载: public st
我正在开发一个有点简单的 InventoryTracker MVC5 应用程序,其中我在将 LocalDatabase 设置为 Seed() 时遇到了一些问题. 当我运行 update-databas
我是一名优秀的程序员,十分优秀!