GetProperty反射导致新属性上出现“模糊匹配”

时间:2012-07-12 00:59:18

标签: c# reflection system.reflection

我如何获得我的财产?目前发生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
}

8 个答案:

答案 0 :(得分:31)

Type.GetProperty

  

发生AmbiguousMatchException的情况......

     

... derived类型使用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));

答案 1 :(得分:22)

对于财产:

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 - 指定只应考虑在提供的类型层次结构级别声明的成员。不考虑继承的成员。

答案 2 :(得分:12)

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

这将从派生类型中获取属性(如果存在),否则为基础。如果需要,这很容易被翻转。

答案 3 :(得分:7)

凯文已经指出了这个问题,但是你不需要复杂的语句,或LINQ:

PropertyInfo propInfoSrcObj = myDE.GetType().
    GetProperty("MyEntity", typeof(MyDerivedEntity));

答案 4 :(得分:1)

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

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

答案 5 :(得分: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;
}

答案 6 :(得分:0)

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

“我的对象”由EF实体组成,其中包含对其他实体的引用。将那些引用属性设置为no可以解决此问题。不知道为什么当序列化发送到JS时,它没有引起循环引用,但是确实存在。

答案 7 :(得分: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();
}