是否可以创建具有两个同名属性的类型?
Is it possible to create a type with two properties having the same name?
根据 documentation,Type.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 和 Public
和 Instance
绑定标志的 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);
根据 documentation,Type.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 和 Public
和 Instance
绑定标志的 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);