根据文档,Type.GetProperty(string, BindingFlags)
在以下情况下抛出AmbiguousMatchException
:
找到多个具有指定名称和匹配项的属性指定的绑定约束
我正在寻找一个GetProperty
方法会抛出的示例类型,因为发现了多个具有相同名称的属性。我创建了一个继承关系(A : B
(,其中两个类使用BindingFlags = Public | Instance
定义了相同的命名公共属性(使用new
关键字(,但这不会抛出。
在C#中,一个类可以实现多个索引器,所有这些索引器都称为Item
。
public class Class1
{
public string this[int firstParameter]
{
get { return ""; }
}
public string this[string firstParameter, int secondParameter]
{
get { return ""; }
}
}
然后您可以使用以下命令生成异常:
class Program
{
static void Main()
{
// This will throw AmbiguousMatchException:
typeof(Class1).GetProperty("Item", BindingFlags.Public | BindingFlags.Instance);
}
}
这将产生具有单个类的AmbiguousMatchException
以及Public
和Instance
绑定标志。
这是一个使用BindingFlags.FlattenHierarchy
的示例,它会导致静态属性和实例属性之间的名称冲突。
public class Program
{
public class A
{
public static string Property { get; set; }
}
public class B : A
{
public string Property { get; set; }
}
public static void Main(string[] args)
{
var type = typeof(B);
var property = type.GetProperty(
"Property",
BindingFlags.Public |
BindingFlags.Static |
BindingFlags.Instance |
BindingFlags.FlattenHierarchy);
}
}
如果你玩BindingFlags
,你可能会得到不明确的匹配。例如,BindingFlags.IgnoreCase
允许您获得此异常,尽管没有相同名称的属性:
class MyClass
{
public string MyProperty {get; set;}
public int Myproperty {get; set;}
}
typeof(MyClass).GetProperty("MyProperty", BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase)
同样,下一次使用BindingFlags.FlattenHierarchy
设置会产生上述错误:
class MyClass : Base
{
public new string MyProperty { get; set; }
}
class Base
{
public static string MyProperty {get;set;}
}
typeof(MyClass).GetProperty("MyProperty",
BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy);