是否可以创建具有两个同名属性的类型?

Is it possible to create a type with two properties having the same name?

根据 documentationType.GetProperty(string, BindingFlags) 抛出 AmbiguousMatchException when:

More than one property is found with the specified name and matching the specified binding constraints

我正在寻找一个示例类型,其中 GetProperty 方法会抛出异常,因为发现多个 属性 具有相同的名称。我创建了一个继承关系 (A : B),其中 类 定义了相同的命名 public 属性(使用 new 关键字),BindingFlags = Public | Instance , 但不会抛出。

在C#中,一个class可以实现多个索引器,所有索引器都称为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);
    }
}

这将生成具有单个 class 和 PublicInstance 绑定标志的 AmbiguousMatchException

这是一个使用 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);