Método de conjunto de propiedades no encontrado
Frecuentes
Visto 5,406 equipos
3
Cuando esta linea bckPk = Traducir(paquetes); ejecuta lo que estoy consiguiendo Método de conjunto de propiedades no encontrado. error que es bastante natural. Pero, ¿alguien puede sugerirme una solución para esto mediante la cual pueda lograr lo que estoy tratando de hacer aquí?
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Reflection;
namespace ExperimentProjects
{
public class ClassOne
{
public string PropertyOne { get; set; }
public string PropertyTwo { get; set; }
public string PropertyThree { get; set; }
}
public class ClassTwo
{
public string PropertyOne { get; set; }
public string PropertyTwo { get; set; }
public string PropertyThree { get; set; }
}
public class ClassPack : Collection<ClassOne>
{
}
public class ClassBckPack : Collection<ClassOne>
{
}
public class TranslateClass
{
public static TResult Translate<TSource, TResult>(TSource sourceObj)
{
Type typeOfSourceObj = sourceObj.GetType();
Type typeOfResultObj = typeof(TResult);
if (typeOfSourceObj.BaseType.Equals(typeOfResultObj.BaseType))
{
//Console.WriteLine("1");
}
ConstructorInfo constructorOfresultObj = typeOfResultObj.GetConstructor(System.Type.EmptyTypes);
Object[] parameters = new Object[0];
TResult result = (TResult)constructorOfresultObj.Invoke(parameters);
PropertyInfo[] propertiesInSourceObj = typeOfSourceObj.GetProperties();
if (propertiesInSourceObj.Length != 0)
{
foreach (PropertyInfo property in propertiesInSourceObj)
{
Console.WriteLine(property.PropertyType.Name);
PropertyInfo propertyOfResultObj = typeOfResultObj.GetProperty(property.Name);
if (propertyOfResultObj != null)
{
propertyOfResultObj.SetValue(result, property.GetValue(sourceObj));
}
}
}
Console.Read();
return result;
}
static void Main(string[] args)
{
ClassOne objOne = new ClassOne();
objOne.PropertyOne = "One";
objOne.PropertyTwo = "Two";
objOne.PropertyThree = "Three";
ClassTwo objTwo = Translate<ClassOne, ClassTwo>(objOne);
Console.WriteLine(objTwo.PropertyOne + " " + objTwo.PropertyTwo + " " + objTwo.PropertyThree);
ClassOne o = Translate<ClassOne, ClassOne>(objOne);
Console.WriteLine(o.PropertyOne + " " + o.PropertyTwo + " " + o.PropertyThree);
ClassPack packs = new ClassPack();
packs.Add(o);
packs.Add(objOne);
ClassBckPack bckPk = null;
try
{
bckPk = Translate<ClassPack, ClassBckPack>(packs);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.Read();
}
foreach (ClassOne eachObj in bckPk)
Console.WriteLine(eachObj.PropertyOne + " " + eachObj.PropertyTwo + " " + eachObj.PropertyThree);
Console.Read();
}
}
}
EDITAR: aquí quiero copiar el objeto de los paquetes a bckPk usando Reflection, sin usar un bucle foreach. Por ejemplo, tome este siguiente ejemplo:
Class Content
{
}
Class AContents : Collection<Content>
{
}
Class BContents : Collection<Content>
{
}
Class BusinessEntity
{
public AContents
{
get; set;
}
}
Class DataContract
{
public AContents
{
get; set;
}
}
I want to use this Translate method this way now :
BusinessEntity be= new BusinessEntity ();
DataContract dc= new DataContract ();
dc=Translate<BusinessEntity,DataContract>(be);
Si ejecuto este código, arrojaré Método de conjunto de propiedades no encontrado error
1 Respuestas
1
Obtiene la excepción porque está intentando establecer un valor para la propiedad ReadOnly. es decir, una propiedad definida solo con getter.
aquí te olvidaste de la herencia ya que tu clase hereda de la base Collection<T>
clase que está recibiendo la excepción
Mientras intenta leer todas las propiedades en ClassPack
y establecer en ClassBckPack
, han heredado un miembro llamado Count
que es de solo lectura, eso significa que no define el Set
método. Así que estás obteniendo la excepción anterior.
Lea la siguiente API de System.Collections.ObjectModel
public class Collection<T> : IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable
{
// Summary:
// Initializes a new instance of the System.Collections.ObjectModel.Collection<T>
// class that is empty.
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public Collection();
//
// Summary:
// Initializes a new instance of the System.Collections.ObjectModel.Collection<T>
// class as a wrapper for the specified list.
//
// Parameters:
// list:
// The list that is wrapped by the new collection.
//
// Exceptions:
// System.ArgumentNullException:
// list is null.
public Collection(IList<T> list);
// Summary:
// Gets the number of elements actually contained in the System.Collections.ObjectModel.Collection<T>.
//
// Returns:
// The number of elements actually contained in the ****System.Collections.ObjectModel.Collection<T>.
public int Count { get; }****
//
// Summary:
// Gets a System.Collections.Generic.IList<T> wrapper around the System.Collections.ObjectModel.Collection<T>.
//
// Returns:
// A System.Collections.Generic.IList<T> wrapper around the System.Collections.ObjectModel.Collection<T>.
protected IList<T> Items { get; }
Así que aquí está el trabajo
Cree su CustomAttribute, diga "ExampleAttribute" y aplíquelo solo a aquellas Propiedades que está tratando de actualizar de la clase de origen a la clase de destino. Luego, lea todas las propiedades y verifique si la propiedad es el tipo de su nuevo atributo. Así es como diferenciará las propiedades de la clase base de su clase secundaria.
foreach (PropertyInfo propertyInfo in type.GetProperties())
{
object[] attrObjs = propertyInfo.GetCustomAttributes(typeof(ExampleAttribute), true);
if (attrObjs.Length > 0)
{
}
}
Siento que esto tiene sentido. gracias
Respondido 12 Feb 14, 09:02
Sí lo tengo. Ahora, ¿puede sugerirme una forma en la que haga que la traducción suceda? - Arijit Saha
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c# reflection collections or haz tu propia pregunta.
Bueno, ¿qué estás tratando de hacer en realidad? Está tratando de establecer el
Count
property en este caso... Puede saber fácilmente si una propiedad se puede escribir o no (use la propiedad CanWrite), pero no creo que eso lo ayude mucho aquí. - Jon SkeetEsta es solo mi impresión, pero se siente mal usar tanta reflexión para un método genérico. En algunos casos puede ser necesario, por supuesto. - Dirk