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



根据文档,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以及PublicInstance绑定标志。

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

相关内容

  • 没有找到相关文章

最新更新