J'ai une classe générique que j'utilise Reflection pour extraire les propriétés du type du générique et la recherche d'un attribut. Je suis récursif dans chaque propriété pour faire la même chose pour chacune de leurs propriétés. Mon problème est quand je viens à une sorte de propriété de collection (propriété qui est une collection) ou de propriété ICollection. Je ne serai pas en mesure de convertir la valeur renvoyée par GetValue en un type spécifique (j'ai essayé de transtyper dans IEnumerable mais ne fonctionne pas pour IEnumerables générique).traiter des éléments dans la liste générique/collections avec réflexion
Voici un code pour aider à comprendre un peu plus:
public class NotificationMessageProcessor<T> : INotificationProcessor<T>
{
IList<string> availableTags = new List<string>();
public string ReplaceNotificationTags<T>(string message, T instance)
{
LoadTagValues(instance);
return ReplaceTags(message);
}
private string ReplaceTags(string message)
{
foreach (KeyValuePair<string, string> tagVal in tagValues)
{
message = message.Replace(string.Format("<{0}>", tagVal.Key), tagVal.Value);
}
return message;
}
private void LoadTagValues(object val)
{
Type elementType = val.GetType();
PropertyInfo[] typeProperties = elementType.GetProperties();
foreach (PropertyInfo prop in typeProperties)
{
NotificationTag[] tags = (NotificationTag[])prop.GetCustomAttributes(typeof(NotificationTag), false);
if (tags != null && tags.Length > 0)
{
string tagName = tags[0].TagName;
object propValue = prop.GetValue(val, null);
string propTypeString = prop.PropertyType.FullName;
tagName = prop.ReflectedType.Name + "." + tagName;
if (propValue != null)
{
tagValues.Add(tagName, propValue.ToString());
}
if (propValue != null)
{
if (!prop.PropertyType.IsPrimitive)
{
LoadTagValues(propValue);
}
}
}
else
{
if (!prop.PropertyType.IsPrimitive)
{
object propValue = null;
if (prop.GetGetMethod().GetParameters().Count() == 0)
{
propValue = prop.GetValue(val, null);
}
else
{
//have a collection...need to process but do not know how many in collection....
propValue = prop.GetValue(val, new object[] { 0 });
}
if (propValue != null)
{
LoadTagValues(propValue);
}
}
}
}
}
NotificationMessageProcessor<User> userProcessor = new NotificationMessageProcessor();
userProcessor.ReplaceNotificationTags<User>(someMessage, instanceOfUser);
L'objet utilisateur possède les attributs appropriés
Certaines informations sur ce que vous voulez réellement faire seraient utiles - tout semble un peu étrange dans l'abstrait. –
J'ai ajouté du code .... – CSharpAtl
Je l'ai compris .... – CSharpAtl