首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GetProperty反射在新属性上导致“找到不明确的匹配”

GetProperty反射在新属性上导致“找到不明确的匹配”
EN

Stack Overflow用户
提问于 2012-07-12 08:59:18
回答 8查看 37.9K关注 0票数 38

我怎样才能得到我的财产?当前Ambiguous match found出现错误,请参阅代码中的注释行。

代码语言:javascript
运行
复制
public class MyBaseEntity
{
    public MyBaseEntity MyEntity { get; set; }
}

public class MyDerivedEntity : MyBaseEntity
{
    public new MyDerivedEntity MyEntity { get; set; }
}

private static void Main(string[] args)
{
    MyDerivedEntity myDE = new MyDerivedEntity();

    PropertyInfo propInfoSrcObj = myDE.GetType().GetProperty("MyEntity");
    //-- ERROR: Ambiguous match found
}
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-07-12 09:08:42

Type.GetProperty

发生AmbiguousMatchException的

情况...

...derived类型声明一个属性,该属性通过使用new修饰符隐藏具有相同名称的继承属性

如果您运行以下命令

代码语言:javascript
运行
复制
var properties = myDE.GetType().GetProperties().Where(p => p.Name == "MyEntity");

您将看到返回了两个PropertyInfo对象。一个用于MyBaseEntity,另一个用于MyDerivedEntity。这就是您收到歧义匹配发现错误的原因。

您可以通过如下方式获取MyDerivedEntityPropertyInfo

代码语言:javascript
运行
复制
PropertyInfo propInfoSrcObj = myDE.GetType().GetProperties().Single(p => 
    p.Name == "MyEntity" && p.PropertyType == typeof(MyDerivedEntity));
票数 44
EN

Stack Overflow用户

发布于 2014-02-27 03:30:11

对于属性:

代码语言:javascript
运行
复制
MemberInfo property = myDE.GetProperty(
    "MyEntity",
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

对于方法:

代码语言:javascript
运行
复制
MemberInfo method = typeof(String).GetMethod(
    "ToString",
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly,
    null,
    new Type[] { },// Method ToString() without parameters
    null);

BindingFlags.DeclaredOnly -指定只应考虑在所提供类型的层次结构级别上声明的成员。继承的成员不被考虑。

票数 33
EN

Stack Overflow用户

发布于 2015-11-03 00:11:49

这种歧义是由于MyDerivedEntity中的new声明造成的。要克服这一点,您可以使用LINQ:

代码语言:javascript
运行
复制
var type = myObject.GetType();
var colName = "MyEntity";
var all = type.GetProperties().Where(x => x.Name == colName);
var info = all.FirstOrDefault(x => x.DeclaringType == type) ?? all.First();

这将从派生类型中获取属性(如果存在),否则将从基类中获取属性。如果需要,这可以很容易地进行翻转。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11443707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档