l'itération sur une propriété indexée (Réflexion)
Je veux itterate sur une propriété indexée que je n'ai accès à la via de réflexion,
mais ( et je dis cela en sachant qu'il y a probablement une embarrassante de réponse simple, MSDN/Google fail =/) je ne peut pas trouver/trouver une façon d'ailleurs l'incrémentation d'un compteur sur le PropertyInfo.GetValue(prop, counter)
jusqu'à ce que le TargetInvocationException
est levée.
ala:
foreach ( PropertyInfo prop in obj.GetType().GetProperties() )
{
if ( prop.GetIndexParameters().Length > 0 )
{
//get an integer count value, by incrementing a counter until the exception is thrown
int count = 0;
while ( true )
{
try
{
prop.GetValue( obj, new object[] { count } );
count++;
}
catch ( TargetInvocationException ) { break; }
}
for ( int i = 0; i < count; i++ )
{
//process the items value
process( prop.GetValue( obj, new object[] { i } ) );
}
}
}
maintenant, il y a certains problèmes avec cette... très laid.. solution..
que si il est multi-dimensionnelle ou non indexés par des entiers par exemple...
heres, le code de test, je suis à l'aide de l'essayer et de le faire fonctionner, si quelqu'un en a besoin. Si quelqu'un est intéressé, je suis en train de faire un système de cache personnalisé et .Équivaut à ne pas le couper.
static void Main()
{
object str = new String( ( "Hello, World" ).ToArray() );
process( str );
Console.ReadKey();
}
static void process( object obj )
{
Type type = obj.GetType();
PropertyInfo[] properties = type.GetProperties();
//if this obj has sub properties, apply this process to those rather than this.
if ( properties.Length > 0 )
{
foreach ( PropertyInfo prop in properties )
{
//if it's an indexed type, run for each
if ( prop.GetIndexParameters().Length > 0 )
{
//get an integer count value
//issues, what if it's not an integer index (Dictionary?), what if it's multi-dimensional?
//just need to be able to iterate through each value in the indexed property
int count = 0;
while ( true )
{
try
{
prop.GetValue( obj, new object[] { count } );
count++;
}
catch ( TargetInvocationException ) { break; }
}
for ( int i = 0; i < count; i++ )
{
process( prop.GetValue( obj, new object[] { i } ) );
}
}
else
{
//is normal type so.
process( prop.GetValue( obj, null ) );
}
}
}
else
{
//process to be applied to each property
Console.WriteLine( "Property Value: {0}", obj.ToString() );
}
}
object str = new String(("Hello, World").ToArray())
?juste un exemple de la variable à transmettre à ma fonction... a essayer les différentes façons de définir une chaîne/Chaîne et laissé un peu de mal...
object str = "Hello, World!";
fonctionne tout aussi bien.Que faire si j'ai des clés de CHAÎNE, pas entier? Je ne connais pas leurs noms. Comment les trouver et les utiliser?
OriginalL'auteur Dead.Rabit | 2010-11-24
Vous devez vous connecter pour publier un commentaire.
De la lecture d'un indexeur est juste comme méthode normale, sauf qu'elle prend entre crochets, pas rond. Vous ne vous attendez pas à être en mesure de déterminer automatiquement la plage de valeurs acceptables pour une méthode, il n'est donc pas possible pour un indexeur.
Length
ouCount
et de l'utiliser comme upperbound pour indexé propriétés, ou une propriété appeléeKeys
pour une chaîne de propriété indexée.seriez-vous en mesure de donner des précisions sur les Touches? je n'ai pas été en mesure de le faire..
OriginalL'auteur Tim Rogers
Indexeurs seront compilées pour les méthodes. Voici un exemple:
Il sera compilé à quelque chose comme ceci:
Le code suivant ne peut pas être compilé parce qu'il y a deux
double get_Item(int)
méthodes dans la classe. L'indexeur est une magie de l'compilateur.foreach(char c in str) Console.write(c);
, seulement avec la réflexion..Voir mon edit. Je pense que ça va vous aider à comprendre l'indexeur.
OriginalL'auteur Danny Chen
Avoir séquentielle des numéros d'index dans une propriété indexée n'en est rien, vous pouvez miser sur.
Indexé propriétés ne sont pas des tableaux.
Contre-exemple:
Selon le type généralement, vous avez d'autres méthodes pour obtenir les éventuelles valeurs de l'indice, dans ce cas
dictionary.Keys
. Si possible avec vos types je voudrais essayer dans cet ordreIEnumerable<T>
pour le type lui-même.IEnumerable<T>
propriété pour chaque propriété indexée.Si vous n'avez pas de spécification de valeurs valides et aucune méthode de demander à ce que les valeurs valides sont, alors vous êtes assez bien hors de la chance.
OriginalL'auteur Albin Sunnanbo
Vous pouvez utiliser
PropertyInfo.GetIndexParameters
pour trouver le nombre et le type de propriété indexée paramètres.Je ne pense pas qu'il n'y a rien que vous pouvez faire sur la recherche des "juridique" des valeurs pour ces paramètres sont, à moins que vous "tricher" et de l'utiliser à l'intérieur des informations que vous avez sur ce que les biens.
OriginalL'auteur Jon
Réussi à faire une amélioration, de l'esprit, aussi constaté que ce test de code souffre d'une boucle infini pour l'auto-références (Tableau.Syncroot par exemple)
En un mot, il se trouve désormais à des choses qui héritent de IEnumerable (qui est plus indexé choses) et d'utiliser une boucle foreach sur ceux et couplé avec la connaissance que l'existant (laid) code fonctionne pour les chaînes, il est maintenant beaucoup plus approfondie alors il a utilisé pour être...
content mais déçu qu'il ne semble pas être une bonne réponse.
Merci pour l'aide tout le monde
Mis à jour le code de test, si quelqu'un se trouve dans une position similaire
OriginalL'auteur Dead.Rabit
Les codes ci-dessus et de celles qui sont liées à cette question ont été vraiment très utile pour le problème que j'ai été confronté. Je poste mon code et j'espère que cela fonctionne pour vous les gars aussi.
public ActionResult Survey(SurveyCollection surveyCollection)
{
if (surveyCollection != null)
{
Answer_DropDownCordinateOptionList traceObject = new Answer_DropDownCordinateOptionList();
IList traceObjectCollection = new List();
traceObjectCollection = ExtractNestedObjects(surveyCollection, traceObject, traceObjectCollection);
}
OriginalL'auteur Deepak Nair