Cum pentru a filtra elementele de colectare în funcție de tipul stocat în variabila

0

Problema

Am urmatoarea ierarhie:

class Animal

class Dog : Animal

class Cat : Animal

Am o List<Animal> colectarea și vreau să fac o metodă care va returna toate pisicile sau toți câinii. Cu toate acestea eu nu pot da seama cum de a filtra lista de elemente bazate pe o variabilă de tip. Deci, ca aceasta:

int AnimalsOfType(Type animalType)
{
    // Gives error "animalType is a variable but is used like a type".
    return animals.OfType<animalType>().Count;
}
c# casting inheritance list
2021-11-21 02:30:01
2

Cel mai bun răspuns

0
using System.Linq;

int AnimalsOfType(Type animalType)
{
    return animals.Count(a => a.GetType() == animalType);
}
2021-11-21 05:33:50

Multumesc, dar de ce nu poate o variabilă de tip vt Type fi folosit ca un tip?
K-RUSHer

Nu poți trece o variabilă de Tip System.Type ca parametrul generic pentru o funcție generic direct. Motivul este: parametrul Generic sunt înlocuite atunci când codul este compilat Citit acest răspuns, care explica mai multe
Ibram Reda

Pot fi simplificate în continuare, pentru a animals.Count(a => a.GetType() == animalType);
Sarin

@Sarin da ai dreptate, eu le-am editat
Ibram Reda
0

Cea mai eficientă metodă este de a folosi MakeGenericMethod și CreateDelegate pentru a crea delegați la metode generice. Puteți cache acești delegați în dicționar

static Dictionary<Type, Func<List<Animal>, int>> _methods = new Dictionary<Type, Func<List<Animal>, int>>();

static int CountOfType<T>(List<Animal> source) =>
    source.Count(a => a is T);  
    
int AnimalsOfType(List<Animal> animals, Type animalType)
{
    if(!_methods.TryGetValue(animalType, out var dlgt))
    {
        dlgt = (Func<List<Animal>, int>)
             this.GetType().GetMethod("CountOfType")
                  .MakeGenericMethod(animalType)
                  .CreateDelegate(typeof(Func<List<Animal>, int>)));
        _methods[animalType] = dlgt;
    }
    return dlgt(animals);
}

Există un singur mic cost de pornire prima dată când ai apela la aceasta metoda, pe tip.

2021-11-21 03:01:30

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................