39

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

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
}
4

8 回答 8

45

类型.GetProperty

发生 AmbiguousMatchException 的情况...

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

如果你运行以下

var properties = myDE.GetType().GetProperties().Where(p => p.Name == "MyEntity");

您将看到PropertyInfo返回了两个对象。一为MyBaseEntity一为MyDerivedEntity。这就是您收到不明确匹配发现错误的原因。

你可以像这样PropertyInfo得到MyDerivedEntity

PropertyInfo propInfoSrcObj = myDE.GetType().GetProperties().Single(p => 
    p.Name == "MyEntity" && p.PropertyType == typeof(MyDerivedEntity));
于 2012-07-12T01:08:42.010 回答
34

对于财产:

MemberInfo property = myDE.GetProperty(
    "MyEntity",
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

对于方法:

MemberInfo method = typeof(String).GetMethod(
    "ToString",
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly,
    null,
    new Type[] { },// Method ToString() without parameters
    null);

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

于 2014-02-26T19:30:10.717 回答
21

由于 中的new声明而出现歧义MyDerivedEntity。要克服这个问题,您可以使用 LINQ:

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();

如果存在,这将从派生类型中获取属性,否则从基类中获取。如果需要,这可以很容易地触发。

于 2015-11-02T16:11:49.163 回答
8

Kevin 已经指出了这个问题,但您不需要复杂的语句或 LINQ:

PropertyInfo propInfoSrcObj = myDE.GetType().
    GetProperty("MyEntity", typeof(MyDerivedEntity));
于 2013-09-27T20:15:50.940 回答
1

我在浏览器控制台中遇到了这个错误我搜索它,我发现这个异常是针对 c# 并且答案也是针对 c# 然后我尝试查看我的代码,我发现了问题发生的位置:

我有一个 ajax post 方法,当我发布数据时出现此错误,因此我传递的数据将由 c# web 方法收集,所以当我看到该模型时,我有 2 个同名的属性,所以我删除了一个,问题和异常解决了。

于 2018-03-10T10:45:13.527 回答
0

我的 LocationKey 对象的 MsgPack 序列化遇到了这个问题。最终成为我在 LocationKey 类中定义的运算符。定义这两个运算符会导致DefaultContext.GetSerializer(obj.GetType());在尝试序列化时抛出 Ambiguous Match Found。删除一组运算符使问题消失了。

public static bool operator ==(int key1, LocationKey key2)
{
    return key1 == key2.Value;
}

public static bool operator !=(int key1, LocationKey key2)
{
    return key1 != key2.Value;
}

public static bool operator ==(LocationKey key1, int key2)
{
    return key1.Value == key2;
}

public static bool operator !=(LocationKey key1, int key2)
{
    return key1.Value != key2;
}
于 2015-04-03T20:18:48.430 回答
0

对我来说,在 VB.Net 中,我在将 JS 对象传递给<WebMethod()>函数时遇到了这个超级描述性错误。

我的对象由包含对其他实体的引用的 EF 实体组成。将这些引用属性设置为无解决了这个问题。不知道为什么在序列化发送到 JS 时这不会导致循环引用,但它确实存在。

于 2019-02-21T18:37:07.960 回答
0

FWIW,这是我使用的代码:

public static PropertyInfo GetUnambiguousProperty(object component, string name, BindingFlags flags = BindingFlags.Public | BindingFlags.Instance) => GetUnambiguousProperty(component?.GetType(), name, flags);
public static PropertyInfo GetUnambiguousProperty(Type type, string name, BindingFlags flags = BindingFlags.Public | BindingFlags.Instance)
{
    if (type == null)
        throw new ArgumentNullException(nameof(type));

    if (name == null)
        throw new ArgumentNullException(nameof(name));

    return type.GetProperties(flags).Where(p => p.Name == name).FirstOrDefault();
}
于 2021-02-23T11:10:50.370 回答