2012-07-12 15 views
21

¿Cómo puedo obtener mi propiedad? Actualmente se está produciendo un error de Ambiguous match found, vea la línea de comentario en el código.GetProperty reflexión resultados en "Concordancia ambigua encontrado" en la nueva propiedad

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 
} 
+1

Error de tiempo de ejecución o error de tiempo de compilación? –

+1

@Valamas Por favor reconsidere la respuesta seleccionada. Muchos vendrán aquí con construcciones condicionales como 'if (winform.GetType(). GetProperty (" Items ")! = Null) {..}' en cuyo caso uno simplemente cambia Excepciones usando Linq ... –

Respuesta

24

Type.GetProperty

Las situaciones en las que se produce AmbiguousMatchException ...

... tipo derivado declara una propiedad que esconde una propiedad heredada con el mismo nombre, usando el nuevo modificador

Si ejecuta el siguiente

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

verá que se devuelven dos objetos PropertyInfo. Uno para MyBaseEntity y otro para MyDerivedEntity. Es por eso que está recibiendo la coincidencia ambigua encontró error.

que pueda obtener el PropertyInfo para MyDerivedEntity así:

PropertyInfo propInfoSrcObj = myDE.GetType().GetProperties().Single(p => 
    p.Name == "MyEntity" && p.PropertyType == typeof(MyDerivedEntity)); 
+2

+1. Buenas manos en la explicación. He agregado un enlace RTFM por si acaso. –

+0

cosas fantásticas! Lo simplifiqué a 'type.GetProperties(). First (p => p.Name ==" MyEntity ")' ¡Todas las pruebas son verdes! –

+1

Independientemente de 'First' o' Single', ambos arrojarán una excepción cuando no haya elementos ** para empezar. –

5

Kevin ya se señaló el problema, pero usted no necesita instrucciones complejas, o LINQ para ello:

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

Para propiedad:

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

Por el método:

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

BindingFlags .DeclaredOnly - Especifica que sólo los miembros declarados a nivel de la jerarquía de tipo suministrado debe ser considerado. Los miembros heredados no son considerados.

0

Estaba teniendo este problema con la serialización MsgPack de mi objeto LocationKey. Terminé siendo los operadores que había definido en mi clase LocationKey. Tener ambos de estos operadores definidos causó que DefaultContext.GetSerializer(obj.GetType()); lanzara Ambiguous Match Found al tratar de serializar. Eliminar un grupo de operadores hizo que el problema desapareciera.

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; 
} 
9

La ambigüedad se produce debido a la declaración de newMyDerivedEntity. Para superar esto, puedes usar 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(); 

Esto va a agarrar la propiedad del tipo derivado si es que existe, de lo contrario la base. Esto se puede voltear fácilmente si es necesario.

+1

Es una solución más universal y extensible realmente. – it3xl

+1

¡Solución muy eficiente! Pero me temo que el orden de las propiedades no está garantizado: _El método 'M: System.Type.GetProperties' no devuelve las propiedades en un orden particular, como el orden alfabético o de declaración. Su código no debe depender del orden en que se devuelvan las propiedades, porque ese orden varía._ (Tomado de [MSDN Documentation] (https://msdn.microsoft.com/en-us/library/aky14axb.aspx#Anchor_1)) – KnorxThieus

+0

Una solución mejor y más universal que la respuesta ampliamente aceptada en la parte superior –

1

Tengo este error en la consola del navegador lo busco y me encontré con esta excepción es para C# y respuesta es también para C# y luego trato de mirar a mi código y me encontré con la que se produce el problema:

Tengo un método de publicación ajax y cuando publico los datos obtuve este error para que los datos que he pasado sean recolectados por el método C# web, así que cuando veo ese modelo tengo 2 propiedades con el mismo nombre, así que elimino uno y el problema y la excepción se solucionó

Cuestiones relacionadas