Alleen een type doorgeven als parameter in C#

Hypothetisch zou het handig zijn om dit te doen:

foo.GetColumnValues(dm.mainColumn, int)
foo.GetColumnValues(dm.mainColumn, string)

waar de GetColumns-methode een andere methode binnen aanroept, afhankelijk van het doorgegeven type.

Ja, ik zou het kunnen doen als een booleaanse vlag of iets dergelijks, ik vroeg me alleen af ​​of er een manier was om dit door te geven, en vroeg toen:

typeof(arg[1]) of vergelijkbaar…

Ik zou de methode ook kunnen negeren, generieke geneesmiddelen gebruiken, enz. – Ik weet dat er verschillende manieren zijn om dit te doen, ik was gewoon benieuwd of dit mogelijk was.


Antwoord 1, autoriteit 100%

Er zijn twee veelvoorkomende benaderingen. Ten eerste kunt u System.Type

doorgeven

object GetColumnValue(string columnName, Type type)
{
    // Here, you can check specific types, as needed:
    if (type == typeof(int)) { // ...

Dit zou heten als: int val = (int)GetColumnValue(columnName, typeof(int));

De andere optie zou zijn om generieke geneesmiddelen te gebruiken:

T GetColumnValue<T>(string columnName)
{
    // If you need the type, you can use typeof(T)...

Dit heeft het voordeel dat het boksen vermijdt en enige typeveiligheid biedt, en zou worden aangeroepen als: int val = GetColumnValue<int>(columnName);


Antwoord 2, autoriteit 10%

foo.GetColumnValues(dm.mainColumn, typeof(string))

U kunt ook een generieke methode gebruiken:

public void GetColumnValues<T>(object mainColumn)
{
    GetColumnValues(mainColumn, typeof(T));
}

en je zou het dan als volgt kunnen gebruiken:

foo.GetColumnValues<string>(dm.mainColumn);

Antwoord 3, autoriteit 6%

Je kunt een type als argument doorgeven, maar daarvoor moet je typeofgebruiken:

foo.GetColumnValues(dm.mainColumn, typeof(int))

De methode zou een parameter van het type Typemoeten accepteren.


waar de GetColumns-methode een andere methode binnen aanroept, afhankelijk van het doorgegeven type.

Als u dit gedrag wilt, moet u het type niet als argument doorgeven, maar in plaats daarvan een typeparameter gebruiken.

foo.GetColumnValues<int>(dm.mainColumn)

Antwoord 4, autoriteit 3%

foo.GetColumnValues(dm.mainColumn, typeof(int));
foo.GetColumnValues(dm.mainColumn, typeof(string));

Of het gebruik van generieke geneesmiddelen:

foo.GetColumnValues<int>(dm.mainColumn);
foo.GetColumnValues<string>(dm.mainColumn);

Antwoord 5

Je kunt dit doen door het gewoon in typeof()

te stoppen

foo.GetColumnValues(typeof(int))
public void GetColumnValues(Type type)
{
    //logic
}

Antwoord 6

U kunt een argument van het type Type – iow, pass typeof(int) gebruiken. Je kunt ook generieke geneesmiddelen gebruiken voor een (waarschijnlijk efficiëntere) aanpak.


Antwoord 7

Gebruik generieke typen!

 class DataExtraction<T>
{
    DateRangeReport dateRange;
    List<Predicate> predicates;
    List<string> cids;
    public DataExtraction( DateRangeReport dateRange,
                           List<Predicate> predicates,
                           List<string> cids)            
    {
        this.dateRange = dateRange;
        this.predicates = predicates;
        this.cids = cids;
    }
}

En noem het zo:

 DataExtraction<AdPerformanceRow> extractor = new DataExtraction<AdPerformanceRow>(dates, predicates , cids);

Other episodes