- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
昨天我在开发 Web 部件时遇到了一个问题(这个问题不是关于 webpart 而是关于 C#)。关于这个问题的背景很少。我有一个使用反射加载 WebPart 的代码,其中我得到了 AmbiguousMatchException。要重现它,请尝试以下代码
public class TypeA
{
public virtual int Height { get; set; }
}
public class TypeB : TypeA
{
public String Height { get; set; }
}
public class Class1 : TypeB
{
}
Assembly oAssemblyCurrent = Assembly.GetExecutingAssembly();
Type oType2 = oAssemblyCurrent.GetType("AmbigousMatchReflection.Class1");
PropertyInfo oPropertyInfo2 = oType2.GetProperty("Height");//Throws AmbiguousMatchException
oPropertyInfo2 = oType2.GetProperty("Height",
BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance); // I tried this code Neither these BindingFlags or any other didnt help
我想知道获取高度属性的 BindingFlag。您会问我为什么要创建另一个已经存在于 Base 类中的 Height 属性。这就是 Microsoft.SharePoint.WebPartPages.PageViewerWebPart
的设计方式,检查 PageViewerWebPart 类的 Height 属性。
最佳答案
那里有两个 Height
属性,它们都不是由您调用 GetProperty
的 Class1 声明的。
现在,可以说您正在寻找“在类型层次结构中声明的 Height 属性尽可能低”吗?如果是这样,这里有一些代码可以找到它:
using System;
using System.Diagnostics;
using System.Reflection;
public class TypeA
{
public virtual int Height { get; set; }
}
public class TypeB : TypeA
{
public new String Height { get; set; }
}
public class Class1 : TypeB
{
}
class Test
{
static void Main()
{
Type type = typeof(Class1);
Console.WriteLine(GetLowestProperty(type, "Height").DeclaringType);
}
static PropertyInfo GetLowestProperty(Type type, string name)
{
while (type != null)
{
var property = type.GetProperty(name, BindingFlags.DeclaredOnly |
BindingFlags.Public |
BindingFlags.Instance);
if (property != null)
{
return property;
}
type = type.BaseType;
}
return null;
}
}
请注意,如果您知道返回类型会有所不同,可能可以简化代码,如sambo99's answer 所示。 .不过,这会使它变得非常脆弱——稍后更改返回类型可能会导致只能在执行时发现的错误。哎哟。我想说的是,当您完成此操作时,无论如何您都处于脆弱的境地:)
关于c# - AmbiguousMatchException - Type.GetProperty - C# 反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/994698/
我写了这段代码: 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
我是一名优秀的程序员,十分优秀!