c# reflection system.reflection

c# - Los resultados de la reflexión de GetProperty en "Coincidencia ambigua encontrada" en la nueva propiedad



reflection system.reflection (6)

¿Cómo puedo obtener mi propiedad? Actualmente se está produciendo un error de una Ambiguous match found , consulte la línea de comentarios en el código.

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 }


Kevin ya señaló el problema, pero no necesita declaraciones complejas, o LINQ para eso:

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


La ambigüedad se produce debido a la new declaración en MyDerivedEntity . 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 tomará la propiedad del tipo derivado si existe, de lo contrario la base. Esto puede ser fácilmente flip-flop si es necesario.


Por propiedad:

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

Por 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 solo deben considerarse los miembros declarados en el nivel de la jerarquía del tipo suministrado. Los miembros heredados no son considerados.


Recibí este error en la consola del navegador. Lo busqué y encontré que esta excepción es para c # y la respuesta también es para c #, luego trato de mirar mi código y encontré dónde ocurre el problema:

Tengo un método de publicación ajax y cuando publico los datos recibí este error, por lo que los datos que pasé se recopilarán con el método web de c #, por lo que cuando veo ese modelo tengo 2 propiedades con el mismo nombre, así que elimino una, problema y excepción se resolvió


Tenía este problema con la serialización MsgPack de mi objeto LocationKey. Terminé siendo los operadores que había definido en mi clase de LocationKey. Tener estos dos operadores definidos causó DefaultContext.GetSerializer(obj.GetType()); para lanzar coincidencia ambigua encontrada al intentar serializar. La eliminación de un conjunto 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; }


Type.GetProperty

Situaciones en las que se produce AmbiguousMatchException ...

... el tipo derivado declara una propiedad que oculta 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 el error de coincidencia ambigua encontrada .

Puede obtener PropertyInfo para MyDerivedEntity esta manera:

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