昨天我在开发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所示。但是,这将使其变得很脆弱-稍后更改返回类型可能会导致仅在执行时发现错误。哎哟。我要说的是,当您完成此操作时,无论如何您都处于脆弱的状况中:)

10-08 02:42