gpt4 book ai didi

c# - BindingFlags.DeclaredOnly 替代方法以避免派生类的属性不明确 (AmbiguousMatchException)

转载 作者:行者123 更新时间:2023-11-30 15:48:20 25 4
gpt4 key购买 nike

我正在寻找一种解决方案来访问类的“展平”(最低)属性值及其通过属性名称的反射派生的值。

即从 ClassBClassC 类型访问 Property1Property2 :

   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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com