昨天我在开发Web部件时遇到了一个问题(此问题不是关于Webpart的,而是关于C#的)。关于此问题的背景知识很少。我有一个使用Reflection加载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来获取Height属性。您将有一个问题,为什么我要创建另一个在Base类中已经存在的Height属性。这就是
Microsoft.SharePoint.WebPartPages.PageViewerWebPart
的设计方式,它检查PageViewerWebPart类的Height属性。 最佳答案
那里有两个Height
属性,而您在其中调用GetProperty
的Class1都没有声明这两个属性。
现在,可以说您要查找“Height属性声明为尽可能靠近hiearchy类型的地方了”吗?如果是这样,请通过以下代码找到它:
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所示。但是,这将使其变得很脆弱-稍后更改返回类型可能会导致仅在执行时发现错误。哎哟。我要说的是,当您完成此操作时,无论如何您都处于脆弱的状况中:)